hdu 2971 Tower(*矩阵乘法)

来源:互联网 发布:htc m8数据连接已断开 编辑:程序博客网 时间:2024/06/05 12:06



超时的代码:

#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);//不是%dmemset(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;}

原创粉丝点击