题目链接:https://cn.vjudge.net/problem/UVA-11582
1 /* 2 问题 3 输入a,b,n(0<a,b<2^64(a and bwill not both be zero) and 1<n<1000) 4 计算并输出f(a^b)%n的结果 5 其中f(i)是斐波那契数列 6 7 解题思路 8 所有的结果都是f(i)对n取模,不妨设F(i)=f(i)%n。不难发现当F(i),F(i+1)出现重复的时候,整个序列就开始出现重复。 9 10 所以设周期为mod,计算出一个循环周期F(0)~f(n^2-1),计算出F(a^b % mod)即可。 11 */ 12 #include<cstdio> 13 #include<iostream> 14 #include<string> 15 using namespace std; 16 17 const int N=1000110; 18 int F[N],mod; 19 int makeF(int n); 20 int kpow(unsigned long long a,unsigned long long p); 21 22 int main() 23 { 24 unsigned long long a,b; 25 int n,T; 26 scanf("%d",&T); 27 while(T--){ 28 cin>>a>>b>>n; 29 if(n==1||!a) {printf("0\n");continue;} 30 mod=makeF(n); 31 printf("%d\n",F[kpow(a%mod,b)]); 32 } 33 return 0; 34 } 35 36 int kpow(unsigned long long a,unsigned long long p){ 37 int ans=1; 38 for(;p;p>>=1,a=(a*a)%mod) if(p&1) ans=(ans*a)%mod; 39 return ans; 40 } 41 42 int makeF(int n) 43 { 44 F[0]=0; 45 F[1]=1; 46 F[2]=1; 47 int l=n*n+10; 48 for(int i=3;i<=l;i++){ 49 F[i] = ((F[i-1]%n)+(F[i-2]%n))%n; 50 if(F[i]==F[2] && F[i-1]==F[1]){ 51 return i-2; 52 } 53 } 54 }