Problem 91 「整数座標における直角三角形」 †
原点Oと2つの整数点(x,y)、x、yは0から50までの数。
で何個直角三角形が描けるか答える問題。
解法
点Aを定めたらOAと直角でAを通る直線状の点だけを検討します。
それだけでパッと答えが出ます。
原点が直角になる場合だけ特別扱いしてアセプトとなります。
sum([],0):-!.
sum([X|Xs],Result):-sum(Xs,Re),Result is Re+X.
points([X,Y]):-
between(0,50,X),
between(0,50,Y),
X+Y>0.
calc1(_,0,_,_,50):-!.
calc1(0,_,_,_,50):-!.
calc1(DX,DY,X,Y,Result):-
T1 is (50-X)//DX,
T2 is Y//DY,
min(T1,T2,T3),
T4 is X//DX,
T5 is (50-Y)//DY,
min(T4,T5,T6),
Result is T3+T6.
calc(Points,Result):-
member([X,Y],Points),
gcd(X,Y,G),
DX is Y//G,
DY is X//G,
calc1(DX,DY,X,Y,Result)
.
main91:-
findall(P,points(P),Points),
findall(Sum,calc(Points,Sum),Sums),
sum(Sums,Ans),
Ans1 is Ans+50*50,
write(Ans1).
最終更新:2014年03月04日 11:42