カメヲラボ

主にプログラミングとお勉強全般について書いてます

Last Digits(2)

通ったコード

GCC、G++では頑張ってみたが通らなかった(´ω`)
でもC++では通った上に最速タイムもでたので良しとしよう。*1
もちろん、これで最短コードを極める元気は無い。。。
入出力にstdio.hを使えば最速タイムが出る。


#include<iostream.h>
#include<iomanip.h>
#include<math.h>

__int64 p(int a,int b,int m){
__int64 u,t=b?p(a,b/2,m)%m:0;
u=t*t%m;
return b?b%2?(u*a)%m:u:1;
}

int f(int b,int i,int m){
return i?p(b,f(b,i-1,m),m):1;
}

main(){
int a=1,i,j,t,m,ans[101][10];

for(;a<=100;++a){
for(i=1;i<10;){
t=i-1?a%10?f(a,i,1e7):0:a;
ans[a][i++]=t;
}
}

for(;cin>>a>>i>>j,a;){
m=pow(10,j);
cout<<setw(j)<<setfill('0')<<ans[a][i>9?9:i]%m<<endl;
}
}

だれかGCCで通ったら教えて下さい!!!

*1:ま、最速で通そうと思えばテーブル作れば超高速だが^^;