1 #include<stdio.h> 2 #include<string.h> 3 #define MOD 10007 4 int main() 5 { 6 int n,x,y,i,j,k,doit[5][5],temp[5][5],a[5][2]; 7 while (~scanf("%d%d%d",&n,&x,&y)) 8 if (n==0) printf("1\n"); else 9 { 10 for (i=1;i<=4;i++) a[i][1]=1; 11 12 memset(doit,0,sizeof(doit)); 13 doit[1][1]=doit[1][2]=doit[4][2]=1; 14 doit[2][2]=((x%MOD)*(x%MOD))%MOD; doit[2][3]=(2*(x%MOD)*(y%MOD))%MOD; 15 doit[2][4]=((y%MOD)*(y%MOD))%MOD; doit[3][2]=x%MOD; doit[3][3]=y%MOD; 16 17 while (n!=0) 18 { 19 if (n%2==1) 20 { 21 for (i=1;i<=4;i++) 22 { 23 temp[i][1]=0; 24 for (j=1;j<=4;j++) 25 temp[i][1]=(temp[i][1]+doit[i][j]*a[j][1]%MOD)%MOD; 26 } 27 for (i=1;i<=4;i++) a[i][1]=temp[i][1]; 28 } 29 n=n/2; 30 for (i=1;i<=4;i++) 31 for (j=1;j<=4;j++) 32 { 33 temp[i][j]=0; 34 for (k=1;k<=4;k++) temp[i][j]=(temp[i][j]+doit[i][k]*doit[k][j]%MOD)%MOD; 35 } 36 for (i=1;i<=4;i++) 37 for (j=1;j<=4;j++) doit[i][j]=temp[i][j]; 38 } 39 printf("%d\n",a[1][1]); 40 } 41 42 }
http://acm.hdu.edu.cn/showproblem.php?pid=3306