※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Problem 120 「自乗で割った余り」 †
(a-1)^n+(a+1)^n を a^2 で割った余りを r と定義する.

例えば, a=7, n=3 の時, r=42 である: 6^3 + 8^3 = 728 ≡ 42 mod 49. n が変われば r も変わるが, a=7 の時 r の最大値 rmax は 42 であることがわかる.

3 ≤ a ≤ 1000 において, Σ rmax を求めよ.


解法
n乗を展開してa^2で割ると残るのはnが奇数なら末尾のan+1とan-1
偶数なら1+1だけです。
奇数の時だけ考えて
an+1とan-1を足すと2anとなります
nは奇数なのでnが増加すると
2a,6a,10a,,,と増加します。
a^2-2を4で割った余りが1か3なら2anはa(a-1)を作れます。
そうでないなら2anはa(a-2)を作れます。
後はこの場合わけを実装するだけです。

この解放は海外のプロジェクトオイラー解説サイトの方法を参考に少し処理を改善して記述しました。

type(N,N1):-R is (N-2) mod 4,member(R,[1,3]),!,N1 is N-1.
type(N,N1):-!,N1 is N-2.

search(1001,Ans):-!,write(Ans).
search(N,Ans):-
	!,
	type(N,N1),
	Add is N*N1,
 	Ans1 is Ans+Add,
	N11 is N+1,
	search(N11,Ans1).

main120:-
	search(3,0).