0299 相似三角形
* * * *
拉格朗日计划
* * * *
相似三角形

给定四个坐标为整数的点:A(a,0),B(b,0),C(0,c),D(0,d),其中0<a<b0<c<d

在直线AC上选择另一个坐标为整数的点P,使得三角形ABP、CDP和BDP均相似。



容易证明仅当a=c时这三个三角形才可能相似。

因此给定a=c,我们需要找到三元组(a,b,d),使得AC上至少存在一个坐标为整数的点P满足三角形ABP、CDP和BDP均相似。

例如,当(a,b,d)=(2,3,4)时,点P(1,1)就满足上述条件。注意三元组(2,3,4)(2,4,3)是不同的,尽管对这两个三元组来说P(1,1)都满足要求。

满足b+d<100且能使得点P存在的不同三元组(a,b,d)一共有92个。

满足b+d<100000且能使得点P存在的不同三元组(a,b,d)一共有320471个。

满足b+d<108且能使得点P存在的不同三元组(a,b,d)一共有多少个?

本题难度:



解答

AP:PC=λ,则容易验证P点坐标是a/(1+λ),cλ/(1+λ)

显然DCP=PAB=3π/4,若三个三角形相似,则还有DPB=3π/4

此时有两种情况DPC=BPA,以及DPC=ABPBPA

先考虑DPC=BPA的情况,此时有DPC=BPA=PDB=PBD=π/8,从而三角都是等腰三角形,且ODB=OBD=π/4

因而有b=d以及λ=1,进而可得ba=2a/2,显然b就不能是整数,因此不合要求。

接下来考虑DPC=ABPBPA的情况,此时有 BAPC=APCD=BPPD, 其中第一个等号可推得 (ba)(da)=2λa2(1+λ)2. 再考虑三角形DPB,它与三角形PAB相似的情况有两种, PBPD=ABAP,PBPD=APAB, 联立可知前者推得PC=AP,即λ=1,后者推得AB=CD,即b=d\ λ=1时有 2(ba)(da)=a2. 显然此时a是偶数,因此枚举偶平数及其约数即可得到这一情况的所有接。

b=d时则有(ba)2=2λa2/(1+λ)2,不难看出λ需要是有理数,设λ=u/v,其中u,v是互素的正整数,则有 (ba)2=2uva2(u+v)2. 由于u,v互素,因此uvu+v也互素,从而u+v需要是a的约数,且2uv需要是完全平方数。

在实现中通过a来枚举u,v是很低效的,反之应当考虑能写成2uv的(偶)平方数,则需要枚举的u,v的与上文λ=1时需要枚举的约数完全相同,再取u+v的倍数作为a即可。

最终结果是549936643

注:本题的上界很大,直接用筛法找出约数在空间上是不可取的,以下直接使用Sympy的divisor函数计算约数,也因此代码为Python 3,此外,代码中打印了进度信息。

from sympy import divisors

bound=100000000
n=bound//3
r1=r2=0
for a in range(2,n+1,2):
    for u in divisors(a*a//2):
        v=a*a//u//2
        if (u+v+2*a) < bound:
            r1+=1
        if u <= v and 2*(u+v+a) < bound:
            r2+=1
    if a%1000000==0:print(a//1000000, "million checked")

print(r1+r2)