题目链接
可以发现当有连续两项为1,1时整个序列开始重复。预处理出所有n的循环节,然后对于a^b快速幂取模得到对应下标
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
typedef unsigned long long ull;
ull a,b;
int n;
int len;
vector<int>mod[1010];
ull qpow(ull x,ull y)
{
ull ret=1;
for(;y;y>>=1)
{
if(y&1)ret=(ret%len)*(x%len)%len;
x=(x%len)*(x%len)%len;
}
return ret;
}
void modtable()
{
_rep(i,2,1000)
{
int x=0,y=1,z=1;
mod[i].push_back(0);mod[i].push_back(1);mod[i].push_back(1);
while(!(y==0&&z==1))
{
x=y;
y=z;
z=(x%i+y%i)%i;
mod[i].push_back(z);
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
ull ans;
modtable();
while(t--)
{
scanf("%llu%llu%d",&a,&b,&n);
if(n==1)
{
puts("0");
continue;
}
len=mod[n].size()-2;
ans=qpow(a,b);
printf("%d\n",mod[n][ans]);
}
return 0;
}