0283 整数比三角形
* * * *
拉格朗日计划
* * * *
整数比三角形

考虑三边长为6、8、10的三角形,可以看出它的边长和面积都是24,因此它的面积和周长之比为1。

再考虑三边长为13、14、15的三角形,它的周长是42,而面积是84,因此它的面积和周长比为2。

考虑所有三边长以及面积和周长之比均为整数、且面积和周长之比不超过1000的三角形,求这些三角形的周长之和。

本题难度:



解答

设三边长分别为a,b,c,面积为S,周长为C,显然S应是整数。

a,b,c和S均为整数的三角形称为Heronian三角形,不过直接使用该页面的生成公式似乎无法正确计数。

此处使用的是该论文中定理2的结果,按定理2的命题枚举生成各参数后计数即得结果$28038042525570324$。

注:为减少代码量,以下代码中使用Sympy库的divisors函数来生成约数列表,故此为Python 3代码,且代码中打印了运行进度。

from sympy import divisors
from math import gcd,sqrt

s=set()
r=0
for m in range(1,1001):
    for u in divisors(2*m):
        for v in range(1,int(sqrt(3)*u)+1):
            if gcd(u,v)==1:
                n=4*m*m*(u*u+v*v)
                for d1 in divisors(n):
                    d2=n//d1
                    if d1<=d2 and (d1+2*m*u)%v==0 and (d2+2*m*u)%v==0:
                        a=(d1+2*m*u)//v+(2*m*v)//u
                        b=(d2+2*m*u)//v+(2*m*v)//u
                        c=(d1+d2+4*m*u)//v
                        k=(min(a,b,c),a+b+c-min(a,b,c)-max(a,b,c),max(a,b,c))
                        if k not in s:
                            s.add(k)
                            r+=a+b+c
    print("m=",m,"checked,current r:",r)

print(r)