斐波纳循环f[m]=0,1,1,2,3,5,8,13.。。。。。题意为找到a^b,然后f[a^b]取余n, a,b,n都是任意数,显而易见这一串数字取余某个数字一定会有循环出现
算出这一串数字取余2-1024的每个值用f纪录,当然因为肯定会有循环出现所以用g记录循环的开始点
有点复杂,需要好好想想
这是个uva可以过然而visual judge过不了的题,宝宝心累,找不到过不了的理由
#include <iostream>
using namespacestd;
#define N 1024
typedef unsignedlonglong ull;
int f[N][N*6],g[N];
int Mo_e(ull a,ull b,int m)
{
if(b==0)
return1;
int ans=Mo_e(a,b/2,m);
ans=ans*ans%m;
if(b&1)
ans=ans*a%m;
return ans;
}
int main()
{
for(int i=2;i<N;i++)
{
f[i][0]=0;
f[i][1]=1;
for(int j=2;;j++)
{
f[i][j]=(f[i][j-2]+f[i][j-1])%i;
if(f[i][j-1]==0&&f[i][j]==1)
{
g[i]=j-1;
break;
}
}
}
int t,n;
ull a,b;
cin>>t;
while(t--)
{
cin>>a>>b>>n;
if(a==0||n==1)
cout<<0<<endl;
else
{
int p=Mo_e(a%g[n],b,g[n]);
//cout<<p<<endl;
cout<<f[n][p]<<endl;
}
}
return0;
}