大家好,欢迎来到IT知识分享网。
题目大意
问 太阳神有一牛群,由白、黑、花、棕四种颜色的公、母牛组成,其间关系如下,求每种牛的个数。
- 公牛中,白牛多于棕牛,二者之差为黑牛的 1 2 + 1 3 \frac{1}{2}+\frac{1}{3} 21+31;黑牛多于棕牛,二者之差为花牛的 1 4 + 1 5 \frac{1}{4}+\frac{1}{5} 41+51;花牛多于棕牛,二者之差为白牛数的 1 6 + 1 7 \frac{1}{6}+\frac{1}{7} 61+71
- 母牛中,白牛是全体黑牛的 1 3 + 1 4 \frac{1}{3}+\frac{1}{4} 31+41;黑牛是全体花牛的 1 4 + 1 5 \frac{1}{4}+\frac{1}{5} 41+51;花牛是全体棕牛的 1 5 + 1 6 \frac{1}{5}+\frac{1}{6} 51+61;棕牛是全体白牛的 1 6 + 1 7 \frac{1}{6}+\frac{1}{7} 61+71
如果用字母 x 0 , x 1 , x 2 , x 3 x_0, x_1, x_2, x_3 x0,x1,x2,x3分别表示白、黑、花、棕各色的公牛数;用 y 0 , y 1 , y 2 , y 3 y_0, y_1, y_2, y_3 y0,y1,y2,y3分别表示白、黑、花、棕各色母牛数,则得8 个未知数的如下7 个方程
x 0 − x 3 = ( 1 2 + 1 3 ) x 1 x 1 − x 3 = ( 1 4 + 1 5 ) x 2 x 2 − x 3 = ( 1 6 + 1 7 ) x 0 y 0 = ( 1 3 + 1 4 ) ( x 1 + y 1 ) y 1 = ( 1 4 + 1 5 ) ( x 2 + y 2 ) y 2 = ( 1 5 + 1 6 ) ( x 3 + y 3 ) y 3 = ( 1 6 + 1 7 ) ( x 0 + y 0 ) \begin{aligned} x_0-x_3=(\frac{1}{2}+\frac{1}{3})x_1\\ x_1-x_3=(\frac{1}{4}+\frac{1}{5})x_2\\ x_2-x_3=(\frac{1}{6}+\frac{1}{7})x_0\\ y_0=(\frac{1}{3}+\frac{1}{4})(x_1+y_1)\\ y_1=(\frac{1}{4}+\frac{1}{5})(x_2+y_2)\\ y_2=(\frac{1}{5}+\frac{1}{6})(x_3+y_3)\\ y_3=(\frac{1}{6}+\frac{1}{7})(x_0+y_0)\\ \end{aligned} x0−x3=(21+31)x1x1−x3=(41+51)x2x2−x3=(61+71)x0y0=(31+41)(x1+y1)y1=(41+51)(x2+y2)y2=(51+61)(x3+y3)y3=(61+71)(x0+y0)
这个题其实是毫无难度的,但非要用Python,那么难点主要如何优雅地表达这个过程,这里选用的是sympy
符号计算。
所以第一步,先给定一些符号
import sympy x0,x1,x2,x3 = sympy.symbols("x0,x1,x2,x3") y0,y1,y2,y3 = sympy.symbols("y0,y1,y2,y3") x = [x0,x1,x2,x3] y = [y0,y1,y2,y3]
sympy求解
然后将阿基米德分牛问题转化为Python代码,其优雅之处在于,这些分数的构建遵循自然数递增的规律,故可通过循环来生成,非常便捷。
frac = lambda x : sympy.Rational(1,x) fs = [] for i in range(3): fs.append(x[i]-x[3]-(frac(2*i+2)+frac(2*i+3))*x[i+1]) for i in range(4): ind = (i + 1) % 4 fs.append(y[i]-(frac(i+3)+frac(i+4))*(x[ind]+y[ind]))
这样就得到了待求方程组
>>> for f in fs: print(f) ... x0 - 5*x1/6 - x3 x1 - 9*x2/20 - x3 x2 - 55*x3/42 -7*x1/12 + y0 - 7*y1/12 -9*x2/20 + y1 - 9*y2/20 -11*x3/30 + y2 - 11*y3/30 -13*x0/42 - 13*y0/42 + y3
但是,8个未知数7个方程,显然没有唯一解,考虑到 x 3 x_3 x3貌似是最小的值,所以最后希望用 x 3 x_3 x3来表示其他数。
res = sympy.solve(fs, x[:3]+y)
结果
查看一下结果
for key in res: print(sympy.latex(key), "&=", sympy.latex(res[key]), r"\\")
x 0 = 781 x 3 336 x 1 = 89 x 3 56 x 2 = 55 x 3 42 y 0 = x 3 y 1 = x 3 y 2 = x 3 y 3 = x 3 \begin{aligned} x_{0} &= \frac{781 x_{3}}{336} &x_{1} &= \frac{89 x_{3}}{56} &x_{2} &= \frac{55 x_{3}}{42} \\ y_{0} &= \frac{ x_{3}}{} &y_{1} &= \frac{ x_{3}}{} & y_{2} &= \frac{ x_{3}}{} &y_{3} &= \frac{ x_{3}}{} \\ \end{aligned} x0y0=336781x3=x3x1y1=5689x3=x3x2y2=4255x3=x3y3=x3
这道题到这里基本上就算解完了,但是牛至少得是个整数,所以接下来要做的是求解分母的最小公倍数。
在sympy中,对于一个分数r,r.p为分子,r.q为分母;【lcm】用于求解最小公倍数。
denominators = [(v/x3).q for v in res.values()] x3Res = sympy.lcm(denominators) #
然后让将x3
的值加入fs
,
fs.append(x3-x3Res) res2 = sympy.solve(fs, x+y) for key in res2: print(sympy.latex(key), "=", res2[key], r"\\")
结果如下
x 0 = x 1 = x 2 = x 3 = y 0 = y 1 = y 2 = y 3 = x_{0} = \\ x_{1} = \\ x_{2} = \\ x_{3} = \\ y_{0} = \\ y_{1} = \\ y_{2} = \\ y_{3} = \\ x0=x1=x2=x3=y0=y1=y2=y3=
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/134507.html