标签:des style blog http java color 使用 os
1 17 18446744073709551615 1998 139
Case 1: 120
题解及代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef unsigned long long __int65; int f[2000]; //记录斐波那契数 int eular(int n) //欧拉函数 { int cnt=n; for(int i=2;i*i<=n;i++) if(n%i==0) { cnt-=cnt/i; while(n%i==0) { n/=i; } } if(n>1) cnt-=cnt/n; return cnt; } int circle(int M) //求循环节 { f[0]=0; f[1]=1; f[2]=1; for(int i=3;;i++) { f[i]=(f[i-1]+f[i-2])%M; if(f[i]==f[1]&&f[i-1]==f[0]) return i-1; } } __int65 quick_mod(__int65 a,__int65 b,int M) //快速幂取模 { __int65 t=1; a=a%M; while(b) { if(b&1) t=t*a%M; b/=2; a=a*a%M; } return t; } int main() { __int65 A,B,N,C; int t,cas=1; cin>>t; while(t--) { cin>>A>>B>>N>>C; if(C==1) { printf("Case %d: 0\n",cas++); continue; } __int65 oula=eular(C); int c=circle(C); __int65 cl=quick_mod(A,B,c); cl=f[cl]; if(oula==1) { printf("Case %d: ",cas++); cout<<quick_mod(cl,1,C)<<endl; continue; } int t=circle(oula); __int65 tl=quick_mod(A,B,t); tl=f[tl]; __int65 mi=quick_mod(tl,N-1,oula)+oula; __int65 di=cl; printf("Case %d: ",cas++); cout<<quick_mod(di,mi,C)<<endl; } return 0; } /* 设t=a^b;G(1)=F[t]; 根据递推公式G(n)=G(n-1)^F[t];可知:G(2)=F[t]^F[t];G(3)=(F[t]^F[t])^F[t]=F[t]^(F[t]*F[t]); 这样我们能看出G(n)=F[t]^(F[t]^(n-1)); 首先我们在这里要先解决F[t]的值,由于a,b的值都比较大,所以求a^b是不现实的(java你可以试试) 但是我们取余的C是比较小的,所以可以使用循环节来求出F[t]%C的值,设A=F[t]%C; 接下来求A^(F[t]^(n-1))%C的值,这里还是由于F[t]的值是没有办法求的,所以需要用到取余来简化计算, 那么我们会想到费马小定理,欧拉公式,但是这里没说C是素数,所以要用到万能公式来求解, 即首先要求出φ(C),然后再求出循环节,得到F[t]%φ(C)的值,这样我们就能求解了。 注意C=1和欧拉函数值为1的情况。 */
hdu 2814 Interesting Fibonacci,布布扣,bubuko.com
hdu 2814 Interesting Fibonacci
标签:des style blog http java color 使用 os
原文地址:http://blog.csdn.net/knight_kaka/article/details/38182939