如果n确定了,只要f[]循环到0和1就是一个周期,而n本身只有1000,所以可以预处理出来
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1010
#define ull unsigned long long
using namespace std;
int f[N][N*6];
int period[N];
int q_bow(ull a,ull b,int p)
{
int rec=(int)a,ret=1;
for (;b;b>>=1)
{
if (b&1) ret=(ret*rec)%p;
rec=(rec*rec)%p;
}
return ret;
}
int handle(ull a,ull b,int n)
{
if ((!a)||(n==1)) return 0;
int cur=q_bow(a%period[n],b,period[n]);
return f[n][cur];
}
int main()
{
for (int i=2;i<=1000;i++)
{
f[i][0]=0;f[i][1]=1;
for (int j=2;;j++)
{
f[i][j]=(f[i][j-1]+f[i][j-2])%i;
if (f[i][j]==1&&f[i][j-1]==0) {period[i]=j-1;break;}
}
}
int t,n;ull a,b;
for (scanf("%d",&t);t>0;t--)
{
cin>>a>>b>>n;
printf("%d\n",handle(a,b,n));
}
return 0;
}