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).