UVa11582 巨大的斐波那契数-CSDN博客

35 阅读1分钟

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000010;
typedef unsigned long long ULL;
int f[maxn];


int pow_mod(ULL a,ULL n,int m){
a%=m;
ULL ans=1;
while(n){
if(n%2) ans=ans*a%m;
a=a*a%m;
n/=2;
}
return (int) ans;
}


int main(){
ULL a,b,n,T,N;
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout); 
cin>>N;
while(N--){
cin>>a>>b>>n;
f[0]=f[1]=1%n;
for(int i=2;;i++){
f[i]=(f[i-1]+f[i-2])%n;
if(f[i]==f[1]&&f[i-1]==f[0]){
T=i-1;
break;
}
}
cout<<f[pow_mod(a,b,T)-1]<<endl;
}
return 0;\

\

//没有打表,时间 0.080,找出循环的周期T,利用快速幂算法找到对应的项就可以了