Matrix Fast power.
#include <bits/stdc++.h>using namespacestd;Const Long Longmod=1e9+7;Const Long Longinf=1e18;intT;Long LongN;structmatrix{Long Longa[5][5]; intR, C; Matrixoperator*(Matrix b);}; Matrix X, Y, Z; Matrix Matrix::operator*(Matrix B) {matrix C; memset (C.A,0,sizeof(C.A)); intI, j, K; for(i =1; I <= R; i++) for(j =1; J <= C; J + +) for(k =1; K <= C; k++) C.a[i][j]= (C.a[i][j] + (a[i][k] * b.a[k][j])%mod)%MoD; C.R=r; C.c=B.C; returnC;}voidinit () {n= N-2; memset (X.A,0,sizeofx.a); memset (Y.A,0,sizeofy.a); memset (Z.A,0,sizeofz.a); Z.R=1; Z.C =3; z.a[1][1]=1; z.a[1][2]=1; z.a[1][3]=1; for(intI=1; i<=3; i++) y.a[i][i]=1; Y.R =3; Y.C =3; x.a[1][1]=1; x.a[1][2]=0; x.a[1][3]=1; x.a[2][1]=1; x.a[2][2]=0; x.a[2][3]=0; x.a[3][1]=0; x.a[3][2]=1; x.a[3][3]=0; X.R=3; X.C =3;}voidWork () { while(n) {if(n%2==1) Y = y*y; N= N >>1; X= x*y; } Z= z*Y; printf ("%lld\n", (z.a[1][1]+z.a[1][2]+z.a[1][3])%mod);}intMain () {scanf ("%d",&T); while(t--) {scanf ("%lld",&N); Init (); Work (); } return 0;}
HDU 6030 Happy Necklace