F[i]=f[i] mod n;F[i]<n;F[i]与F[i+1]重复出现时,整个序列就会开始重复出现;最多n^2项就会重复出现,算出F[a ^ b]对应那一项即可。 #include<iostream> #include<cstdio> using namespace std; unsigned long long f[1000005],t,a,b,n,len; unsigned long long pow_mid(unsigned long long aa,unsigned long long bb,unsigned long long c) { if(bb==0) return 1; unsigned long long x=pow_mid(aa,bb/2,c); unsigned long long ans=(x*x)%c; if(bb%2) ans=(ans*(aa%c))%c; return ans; } int main() { f[1]=1;f[2]=1; cin>>t; while(t--) { cin>>a>>b>>n; if(n==1 || a==0) { cout<<'0'<<endl; continue; } for(int i=3;i<=n*n+10;i++) { f[i]=(f[i-1]+f[i-2])%n; if(f[i]==f[1]&&f[i-1]==f[2]) { len=i-2; break; } } cout<<f[pow_mid(a%len,b,len)]%n<<endl; } }