题意:就是让你求f(a^b)%n。数据大,很明显暴力是不可能的,这辈子都不可能的…
思路:裴波那切数列有一个性质,尾数循环。
斐波那契数列的个位数:一个60步的循环
最后两位数是一个300步的循环
最后三位数是一个1500步的循环
最后四位数是一个15000步的循环
最后五位数是一个150000步的循环
求出对应的循环周期,问题就变成了快速幂取模了。
#include<stdio.h>
#include<string.h>
typedef unsigned long long ull;
ull f[1000100];
ull quick_mod(ull a,ull b,ull n)
{
ull res=1;
while(b)
{
if(b&1)res=((res%n)*(a%n))%n;
a=((a%n)*(a%n))%n; //由于给出的n比较大所以~
b>>=1; //>>和<<符号省时
}
return res%n;
}
int main()
{
int t,i,j;
ull a,b,n,s,q;
scanf("%d",&t);
while(t--)
{
scanf("%llu%llu%llu",&a,&b,&n); //数据大,用llu存
if(a==0||n==1)
{
printf("0\n");
continue;
}
int ans=0;
f[0]=0,f[1]=1;
f[2]=1;
for(i=2; i<=n*n; i++) //裴波那切数列一性质:不超过n*n
{
f[i]=(f[i-1]+f[i-2])%n;
ans++; //循环周期
if(f[i]==1&&f[i-1]==0)
break;
}
int p=quick_mod(a,b,ans);
printf("%llu\n",f[p]);
}
return 0;
}