由于模数为n,又因为F[i] = (F[i-1] + F[i-2]) % n,所以F[i]只有n*n种可能(F[i-1]有n种可能,F[i-2]有n种可能),所以循环节长度比小于n*n,因此我们只要算出循环节,再用快速幂解出k = a^b%L(L为循环节长度),输出F[k]即可。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef unsigned long long LL;
LL a, b;
int F[1005*1005];
int pow(LL aa,LL p,int Mod)
{
int ret=1;
while(p)
{
if(p & 1) {
ret *= aa; ret %= Mod;
}
aa *= aa;
aa %= Mod;
p >>= 1;
}
return ret;
}
void solve() {
int n;
int M;
cin >> a >> b >> n;
if(n==1 || !a) { printf("0\n"); return; }
F[1] = F[2] = 1;
for(int i = 3; ; i++) {
F[i] = F[i-1] + F[i-2];
F[i] %= n;
if(F[i] == F[1] && F[i-1] == F[2]) {
M = i-2;
break;
}
}
int k = pow(a%M, b, M);
printf("%d\n", F[k]);
}
int main() {
//freopen("ztest.txt","r",stdin);
int T;
scanf("%d", &T);
while(T--) solve();
return 0;
}