有沒有人跟我一樣WA908的.....
求解...
#include<stdio.h>
int n,f[1000005],cycle[1001]={0};
int power(unsigned long long a,unsigned long long b)
{
a=a%cycle[n];
if(a==0) return 0;
else if(b==0) return 1;
else
{
if(b%2==0) return power((a*a)%cycle[n],b/2);
else return (a*power((a*a)%cycle[n],b/2))%cycle[n];
}
}
long long int c[2][2]={{0,1},{1,1}},d[2][2]={{1,0},{0,1}};
void p(long long int a[2][2],long long int b[2][2],long long int m)
{
if(m==0)
{
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++) d[i][j]=b[i][j];
}
}
else if(m%2==0)
{
long long int x[2][2]={0};
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
for(int k=0;k<2;k++)
{
x[i][j]+=a[i][k]*a[k][j];
}
x[i][j]%=n;
}
}
p(x,b,m/2);
}
else
{
long long int x[2][2]={0},y[2][2]={0};
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
for(int k=0;k<2;k++)
{
x[i][j]+=a[i][k]*a[k][j];
y[i][j]+=a[i][k]*b[k][j];
}
x[i][j]%=n;
y[i][j]%=n;
}
}
p(x,y,m/2);
}
}
int main()
{
int T;
unsigned long long a,b;
scanf("%d",&T);
while(T--)
{
scanf("%llu%llu%d",&a,&b,&n);
f[0]=0; f[1]=1;
c[0][0]=0; c[0][1]=1; c[1][0]=1; c[1][1]=1;
d[0][0]=1; d[0][1]=0; d[1][0]=0; d[1][1]=1;
if(cycle[n]==0&&n>1)
{
for(int x=2;;x++)
{
f[x]=(f[x-1]+f[x-2])%n;
if(f[x]==1&&f[x-1]==0)
{
cycle[n]=x-1;
break;
}
}
}
if(n==1) puts("0");
else
{
p(c,d,power(a,b)%cycle[n]);
printf("%lld\n",d[0][1]%n);
}
}
return 0;
}