Problem 48 「自身のべき乗(self powers)」 †
次の式は, 11 + 22 + 33 + ... + 1010 = 10405071317 である.
では, 11 + 22 + 33 + ... + 10001000 の最後の10桁を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2048解法
計算するだけです。
特に意味がありませんが10桁以上は無視して計算しました。
mod_pow(N,0,_,N):-!.
mod_pow(N,R,ND,Result):-
R mod 2=:=1,
!,
N1 is (N*ND) mod 10^10,
ND1 is (ND^2) mod 10^10,
R1 is R//2,
mod_pow(N1,R1,ND1,Result).
mod_pow(N,R,ND,Result):-
!,
R1 is R//2,
ND1 is (ND^2) mod 10^10,
mod_pow(N,R1,ND1,Result).
sum([],0):-!.
sum([X|Xs],Result):-
!,
sum(Xs,Re),
Result is (Re+X) mod 10^10.
main48:-
findall(E,(between(1,1000,N),mod_pow(1,N,N,E)),List),
sum(List,Ans),
write(Ans).
0 件のコメント:
コメントを投稿