像刘汝佳书上说的,斐波那契数有一个叫尾数循环的性质:个位数是一个60步的循环,最后两位数是一个300步的循环。。。但是不会超过n^2;感兴趣的朋友可以查一查。
所以问题就变成了求a^b这个超大的数mod n等于多少,也就是所谓的幂取模利用递归,将大数分解取模;
但是要注意,0对任何数取模都是0,任何数对1取模都是0;
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const int maxn = 1000000+10;
int f[maxn],kase;
int pow_mod(ULL a,ULL n,int m) {
if(n==0) return 1;
ULL x=pow_mod(a,n/2,m);
ULL ans = (ULL)x * x % m;
if(n%2==1) ans = ans*a%m;
return (int )ans;
}
int solve(ULL a,ULL b,int n) {
if(a==0||n==1) return 0;
for(int i=2;;i++){
f[i]=f[i-1]+f[i-2];
f[i]=f[i]%n;
if(f[i-1]==0&&f[i]==1) { kase=i-1;break; }
}
int v=pow_mod(a%kase,b,kase);
return f[v];
}
int main() {
int t,n;
ULL a,b;
scanf("%d",&t);
while(t--) {
cin>>a>>b>>n;
f[0]=0;
f[1]=1;
printf("%d\n",solve(a,b,n));
}
return 0;
}