hdu 4291 (循环节+矩阵快速幂,2012成都网络选拔赛1004)

来源:互联网 发布:java swing 开源项目 编辑:程序博客网 时间:2024/05/18 01:32

点击打开链接


最近刚学矩阵快速幂,下午做网选,马上就遇到了,竟然可以根据循环节找循环节!!!!还是做这类题目少啊!!


由1000000007求出222222224

由222222224求出183120


#include"stdio.h"#include"string.h"#define N 150001#define m1 1000000007#define m2 222222224#define m3 183120typedef __int64 LL;struct node{LL a[3][3];}A;//找循环节void fun(){LL i,t,m;LL g0,g1;g0=0;g1=1;m=m1;/*由m1求m2由m2求m3*/for(i=2;;i++){t=(3*g1%m+g0%m)%m;g0=g1;g1=t;if(g0==0&&g1==1){printf("%d\n",i-1);break;}}}//A*B%mnode mult(node A,node B,LL m){int i,j,k;node C;memset(C.a,0,sizeof(C.a));for(i=1;i<=2;i++){for(j=1;j<=2;j++){for(k=1;k<=2;k++){C.a[i][j]+=A.a[i][k]*B.a[k][j];C.a[i][j]%=m;}}}return C;}//A^k%mLL pow(node A,LL k,LL m){node B;B.a[1][1]=B.a[2][2]=1;B.a[1][2]=B.a[2][1]=0;while(k){if(k%2)B=mult(A,B,m);A=mult(A,A,m);k/=2;}return B.a[1][2]%m;}int main(){//fun();LL n;while(scanf("%I64d",&n)!=-1){if(n<2)printf("%d\n",n);else{A.a[1][1]=3;A.a[1][2]=A.a[2][1]=1;A.a[2][2]=0;LL ans;ans=pow(A,pow(A,pow(A,n,m3),m2),m1);printf("%I64d\n",ans);}}return 0;}


原创粉丝点击