とりあえず何も考えない漸化式で(定型文だなこれ)答えが出ました。
計算時間30秒。
多分一番平凡な解答。
賢い解答ならもっと早いと思います。
#include<stdio.h>
#include<iostream>
const int MOD=250;
const __int64 M8=pow(10,8);
const __int64 MOD16=M8*M8;
int f(int n){
int m=n%MOD;
int r=n;
int ans=1;
while(r>0){
if(r%2==1){
ans=(ans*m)%MOD;
}
m=(m*m)%MOD;
r/=2;
}
return ans;
}
int main(){
__int64 ans[MOD]={0};
__int64 next[MOD]={0};
for(int i=1;i<=250250;i++){
int add=f(i);
for(int j=0;j<MOD;j++){
int p=(add+j)%MOD;
__int64 c=ans[j];
next[p]=(next[p]+c)%MOD16;
}
next[add]=(next[add]+1)%MOD16;
memcpy(ans,next,sizeof(next));
}
std::cout<<ans[0]<<"\n";
}
最終更新:2016年01月25日 20:04