プロジェクトオイラー問48

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2048
Problem 48 「自身のべき乗(self powers)」 †
1^1+2^2+,,,,+1000^1000の末尾10桁を答えよ。
無意味に計算量を抑えてみたりするくらいしか思いつきませんでした。
ペンシルアンドペーパー的な賢い解法あるのかなこれ?


mult(R,Pow,Pow):-R mod 2=:=1,!.
mult(_,_,1):-!.

mod_pow(N,0,_,_,N):-!.
mod_pow(N,R,Pow,Mod,Result):-
	R1 is R//2,
	mult(R,Pow,Mult),
	N1 is (N*Mult) mod Mod,
	Pow1 is (Pow^2) mod Mod,
	mod_pow(N1,R1,Pow1,Mod,Result).

calc(E):-
 	between(1,1000,N),
	Mod is 10^10,
	mod_pow(1,N,N,Mod,E).

sum([],Sum,Sum):-!.
sum([X|Xs],Sum,Result):-
	Sum1 is X+Sum,
	sum(Xs,Sum1,Result).

main:-findall(E,calc(E),Es),
	sum(Es,0,Ans),
	Ans1 is Ans mod 10^10,
	write(Ans1).
最終更新:2014年12月07日 08:02