不妨设三边的长度为$a < b < c$,则容易看出缺口正方形的边长是$b-a$,因此只需找到能令$b-a$整除c的勾股数组即可。
用欧几里得算法生成周长不超过一亿的本原勾股数组, 每个本原勾股数组$(a,b,c)$经过缩放可以生成$(10^8-1)/(a+b+c)$组解,从而不难计算出结果是$10057761$。
import math
r={}
for m in range(2,7072):
for n in range(1-m%2,m,2):
if math.gcd(m,n)==1:
a,b,c=m*m-n*n,2*m*n,m*m+n*n
a,b=min(a,b),max(a,b)
if c%(b-a)==0 and (a,b,c) not in r:
r[(a,b,c)]=100000000//(a+b+c)-(100000000%(a+b+c)==0)
print(sum(r[i] for i in r))
|