Project Euler 276
Project Euler 276
题目
Primitive Triangles
Consider the triangles with integer sides \(a, b\) and \(c\) with \(a \le b \le c\).
An integer sided triangle \((a,b,c)\) is called primitive if \(\gcd(a,b,c)=1,(\gcd(a,b,c)=\gcd(a,\gcd(b,c)))\).
How many primitive integer sided triangles exist with a perimeter not exceeding \(10 000 000\)?
解决方案
首先考虑这个问题的一个简单版:
去除互质的限制后,有多少个三角形?
暴力枚举出一部分项后,查询OEIS,结果为A001400,找到FORMULA
一栏,它给出了一个\(9\)阶的递推式:
1 | a(n) = 1 + (a(n-2) + a(n-3) + a(n-4)) - (a(n-5) + a(n-6) + a(n-7)) + a(n-9). - Norman J. Meluch (norm(AT)iss.gm.com), Mar 09 2000 |
那么,令去除掉互质限制后的周长不超过\(n\)的三角形个数为\(f(n)\),令\(g(n)\)表示原本题目中要求的三角形个数。
每一个互质的三角形,每条边的边长都延长到原来的\(k\)倍,那么它的周长也将延长到原来的\(k\)倍。每一个非互质三角形都对应着一个互质三角形。因此,可以写出\(f\)和\(g\)之间的关系:
\[f(n)=\sum_{k=1}^n g\left(\left\lfloor\dfrac{n}{k}\right\rfloor\right)\]
其中\(k\)就是不同的倍数。那么就可以写成关于\(g(n)\)的递推式:
\[g(n)=f(n)-\sum_{k=2}^n g\left(\left\lfloor\dfrac{n}{k}\right\rfloor\right)\]
右边的式子是一个明显的数论分块特征,最终使用数论分块来完成\(g(n)\)的计算。
代码
1 |
|