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