因为数太大一定会溢出,所以找规律,发现最多n²会出现重复。
先计算出一个周期里的,所有满足f(a的b次幂)处以n的余数,接下来就是匹配,
让a的次幂匹配到这个周期里对应的下标,把含有该下标的除以n的余数输出。
注意unsigned long long 不要在while循环里写,不然会栈溢出。
此外通过此题,还学会了如何用位运算求a的b次幂。
if(b&1){
ans=ans*a%T;
b--;
}
这个用来算长度为n-1的位,
a=a*a%T;
b>>=1;
这个用来算第n位
#include<bits/stdc++.h>
using namespace std;
int f[1000005];
int fi(unsigned long long a,unsigned long long b,int T){
int ans=1;
while(b){
if(b&1){
ans=ans*a%T;
b--;
}
a=a*a%T;
b>>=1;
}
return ans;
}
unsigned long long a,b;
int main(){
int n,T=1;
scanf("%d",&n);
while(n--){
int n;
scanf("%llu %llu %d",&a,&b,&n);
if(n==1||a==0)
{
cout<<0<<endl;
continue;
}
f[0]=0; f[1]=1;
for(int i=2;i<=n*n+100;i++){
f[i]=(f[i-1]+f[i-2])%n;
if(f[i]==f[1] && f[i-1]==f[0]){
T=i-1;
break;
}
}
int gg=fi(a%T,b,T);
printf("%d\n",f[gg]);
}
}