hdu3306 矩阵快速幂

 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

posted on 2014-07-22 16:10  xiao_xin  阅读(120)  评论(0编辑  收藏  举报

导航