超时的代码:
#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
struct node
{
__int64 matrix[5][5];
}ma,e;
__int64 m,n;
node operator *(node x,node y)
{
node temp;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
{
temp.matrix[i][j]=0;
for(int k=1;k<=4;k++)
temp.matrix[i][j]+=(x.matrix[i][k]*y.matrix[k][j])%m;
temp.matrix[i][j]%=m;
}
return temp;
}
node operator ^(node x,__int64 k)
{
if(k==0)
return e;
node ans=e,p=x;
while(k)
{
if(k&1)
{
ans=ans*p;
}
k=k/2;
p=p*p;
}
return ans;
}
int main()
{
__int64 t,a2;
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d %I64d %I64d",&a2,&n,&m);//不是%d
memset(ma.matrix,0,sizeof(ma.matrix));
memset(e.matrix,0,sizeof(e.matrix));
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
{
if(i==j)
e.matrix[i][j]=1;
}
if(a2==1)
{
printf("%I64d\n",n%m);
continue;
}
a2=a2%m;
ma.matrix[1][1]=(4*a2*a2)%m;
ma.matrix[1][2]=(2-8*a2*a2)%m;
ma.matrix[1][3]=(4*a2*a2)%m;
ma.matrix[1][4]=-1;
ma.matrix[2][1]=ma.matrix[3][2]=ma.matrix[4][3]=1;
__int64 ans=1;
__int64 a3=(2*a2*a2-1)%m;
__int64 a4=(2*a2*a3-a2)%m;
__int64 s1=1,s2=s1+a2*a2,s3=s2+a3*a3,s4=s3+a4*a4;
if(n==2)
printf("%I64d\n",s2%m);
else if(n==3)
printf("%I64d\n",s3%m);
else if(n==4)
printf("%I64d\n",s4%m);
else
{
node temp=ma^(n-4);
//__int64 ans=(temp.matrix[1][1]*s1+temp.matrix[1][2]*s2+temp.matrix[1][3]*s3+temp.matrix[1][4]*s4);
__int64 ans=0;
ans=(temp.matrix[1][1]*s1)%m;
if(ans<0)
ans=(ans+m)%m;
ans+=temp.matrix[1][2]*s2;
if(ans<0)
ans=(ans+m)%m;
ans+=temp.matrix[1][3]*s3;
if(ans<0)
ans=(ans+m)%m;
ans+=temp.matrix[1][4]*s4;
if(ans<0)
ans=(ans+m)%m;
printf("%I64d\n",ans);
}
}
//system("pause");
return 0;
}