Matrix Fast Power
#include <cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespacestd;structmatrix{Long Longa[Ten][Ten]; Matrixoperator*(Matrix b);};Const Long LongMod=1000000007;Long Longr,c;Long LongN,a0,ax,ay,b0,bx,by; Matrix Matrix::operator*(Matrix B) {matrix C; inti,j,k; memset (C.A,0,sizeof(C.A)); for(i=1; i<=r; i++) for(j=1; j<=c; J + +) for(k=1; k<=5; k++) C.a[i][j]= (c.a[i][j]+ (a[i][k]*b.a[k][j])%mod)%MOD; returnC;}intMain () {inti,j; while(~SCANF ("%lld",&N)) {scanf ("%lld%lld%lld",&a0,&ax,&AY); scanf ("%lld%lld%lld",&b0,&bx,&by ); A0=a0%MOD; AX=ax%MOD; AY=ay%MOD; B0=b0%MOD; BX=bx%MOD; by=by%MOD; if(n==0) {printf ("0\n"); Continue; } Matrix JZ; JZ. a[1][1]=1; JZ. a[1][2]=0; JZ. a[1][3]=0; JZ. a[1][4]=0; JZ. a[1][5]=0; JZ. a[2][1]=1; JZ. a[2][2]= (AX*BX)%mod; JZ. a[2][3]=0; JZ. a[2][4]=0; JZ. a[2][5]=0; JZ. a[3][1]=0; JZ. a[3][2]= (Ax*by)%mod; JZ. a[3][3]=ax%mod; JZ. a[3][4]=0; JZ. a[3][5]=0; JZ. a[4][1]=0; JZ. a[4][2]= (AY*BX)%mod; JZ. a[4][3]=0; JZ. a[4][4]=bx%mod; JZ. a[4][5]=0; JZ. a[5][1]=0; JZ. a[5][2]= (Ay*by)%mod; JZ. a[5][3]=ay%mod; JZ. a[5][4]=by%mod; JZ. a[5][5]=1; Matrix C; for(i=1; i<=9; i++) { for(j=1; j<=9; J + +) { if(I==J) c.a[i][j]=1; Elsec.a[i][j]=0; } } Long Longb=n-1; R=5; C=5; while(b>0) { if(b%2==1) c=c*jz,b--; Elsejz=jz*jz,b=b/2; } Matrix CS; Cs. a[1][1]= (a0*b0)%MOD; Cs. a[1][4]= ((B0*BX)%mod+by)%MOD; Cs. a[1][3]= ((a0*ax)%mod+ay)%MOD; Cs. a[1][2]= (CS. a[1][3]*cs. a[1][4])%MOD; Cs. a[1][5]=1; R=1; C=5; if(n!=1) cs=cs*C; printf ("%lld\n"Cs. a[1][1]); } return 0;}
HDU 4686 ARC of the Dream