2014年3月18日火曜日

プロジェクトオイラー Problem 48 「自身のべき乗(self powers)」 †

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 件のコメント:

コメントを投稿