Project Euler 283
Project Euler 283
题目
Integer sided triangles for which the area/perimeter ratio is integral
Consider the triangle with sides \(6, 8\) and \(10\). It can be seen that the perimeter and the area are both equal to \(24\).
So the area/perimeter ratio is equal to \(1\).
Consider also the triangle with sides \(13, 14\) and \(15\). The perimeter equals \(42\) while the area is equal to \(84\).
So for this triangle the area/perimeter ratio is equal to \(2\).
Find the sum of the perimeters of all integer sided triangles for which the area/perimeter ratios are equal to positive integers not exceeding \(1000\).
解决方案
设\(M=1000\),三边为整数 \(a,b,c\),周长 \(P=a+b+c\),半周长\(s=\dfrac{P}{2}\),面积 \(A\)。
海伦公式的等价形式为
\[16A^2=(a+b+c)(-a+b+c)(a-b+c)(a+b-c).\]
题目要求面积周长比为正整数且不超过 \(1000\)。令\(\dfrac{A}{P}=m, 1\le m\le 1000\)
则 \(A=mP=m(a+b+c)\)。代入上式并约去一项 \((a+b+c)\) 得
\[ (-a+b+c)(a-b+c)(a+b-c)=16m^2(a+b+c). \tag{1} \]
观察三个因子\(X_1=-a+b+c, X_2=a-b+c, X_3=a+b-c\),它们两两之差为\(X_2-X_1=2a, X_3-X_2=2b, X_3-X_1=2b\),因此 \(X_1,X_2,X_3\) 同奇偶。
而式 \((1)\) 右侧含 \(16m^2\),必为偶数,所以左侧乘积为偶数,从而每个因子都必须为偶数。于是可令
\[2x=-a+b+c,2y=a-b+c,2z=a+b-c\tag{2}\]
把 \((2)\) 相加两两消元可解出三边:
\[a=y+z, b=x+z, c=x+y. \tag{3}\]
并且周长为
\[P=a+b+c=2(x+y+z), s=x+y+z. \tag{4}\]
注意:只要 \(x,y,z>0\),由 \((3)\) 得到的 \(a,b,c\) 自动满足三角形不等式(例如 \(a=y+z<(x+z)+(x+y)=2x+y+z\) 恒成立),因此不会产生退化或非法三角形。
由海伦公式 \(A^2=s(s-a)(s-b)(s-c)\),结合 \((3),(4)\),可得\(s-a=x, s-b=y, s-c=z\)。
因此
\[ A^2=s\cdot x\cdot y\cdot z=(x+y+z)xyz. \tag{5} \]
另一方面 \(A=mP=2m(x+y+z)\),所以
\[ A^2=4m^2(x+y+z)^2. \tag{6} \]
联立 \((5),(6)\),并约去 \(x+y+z>0\),得到核心丢番图方程:
\[ xyz=4m^2(x+y+z). \tag{7} \]
令\(n=4m^2\),则 \((7)\) 写成
\[ xyz=n(x+y+z). \tag{8} \]
可以得到:
\[ xyz-ny-nz=nx. \tag{9} \]
注意左边形如 “关于 \(n\) 的二次式差一点就能配方”。对 \((9)\) 先乘 \(x\) 再加 \(n^2\):
左右分别得到:
\[ \begin{aligned} x(xyz-ny-nz)+n^2&=x^2yz-nx(y+z)+n^2\\ &=n^2-n(xy+xz)+x^2yz\\ &=(n-xy)(n-xz)\\ &=(xy-n)(xz-n)\\ x\cdot nx+n^2&=nx^2+n^2\\ &=n(n+x^2) \end{aligned} \]
于是得到最终方程为
\[ (xy-n)(xz-n)=n(n+x^2). \tag{10} \]
由于方程 \((7)\) 对 \(x,y,z\) 对称。为避免同一三角形被不同排列重复计数,可强制排序\(x\le y\le z\)。
由 \((7)\) 与 \(x\le y\le z\) 得 \(x+y+z\le 3z\),所以
\[ xyz=n(x+y+z)\le 3nz \Longrightarrow xy\le 3n. \tag{11} \]
再由 \(x\le y\) 得 \(x^2\le xy\le 3n\),于是\(x\le \sqrt{3n}=\sqrt{12}m\)
这给出枚举 \(x\) 的有限范围。
固定 \(m\)(因此固定 \(n=4m^2\))与某个 \(x\),令\(R=n(n+x^2)\)。由 \((10)\) 可设\(d_1=xy-n, d_2=xz-n\),则\(d_1d_2=R\)。
因此只要枚举 \(R\) 的正约数对 \((d_1,d_2)\)(满足 \(d_1d_2=R\)),即可反解\(y=\dfrac{d_1+n}{x}, z=\dfrac{d_2+n}{x}\)。
只保留满足以下条件的解:
- \(y,z\) 为正整数(即 \(x\mid(d_1+n)\) 且 \(x\mid(d_2+n)\));
- 排序约束 \(x\le y\le z\)(用于去重)。
一旦得到 \((x,y,z)\),由 \((3)\) 可得三边\((a,b,c)=(y+z,x+z,x+y)\)
周长由 \((4)\) 直接为\(P=2(x+y+z)\)。
对每个 \(m\le M\),有
而由于 \(x^2\le 3n\),因此\(n+x^2\le 4n\le 16m^2\le 16\cdot 10^6.\)
也就是说,\((10)\) 里的两个因子 \(n\) 与 \(n+x^2\) 都不超过 \(16m^2\) 的量级。于是可以预处理一个“最小质因子”数组到上界,快速分解每个 \(n\) 与 \(n+x^2\),再合并得到 \(R=n(n+x^2)\) 的质因数分解,从而生成全部约数用于产生 \(y,z\)。
(这正对应你给的实现备注:用最小质因子表来提取所需分解与约数。)
代码
1 |
|