首页 > 代码库 > 矩阵快速幂 模板

矩阵快速幂 模板

矩阵快速幂模板

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<set>
 4 #include<string.h>
 5 using namespace std;
 6 int const mod=1e9+7;
 7 struct matrix
 8 {
 9     long long m[3][3];
10     matrix()
11     {
12         memset(m,0,sizeof(m));
13     }
14     matrix operator*(const matrix b)const
15     {
16         int i,j,k;
17         matrix ans;
18         for(i=0; i<3; i++)
19         {
20             for(j=0; j<3; j++)
21             {
22                 ans.m[i][j]=0;
23                 for(k=0; k<3; k++)
24                 {
25                     ans.m[i][j]+=m[i][k]*b.m[k][j];
26                     ans.m[i][j]%=mod;
27                 }
28             }
29         }
30         return ans;
31     }
32     void set(int a,int b)
33     {
34         m[0][0]=a;
35         m[0][1]=b;
36         m[1][0]=1;
37         m[1][1]=0;
38         m[2][0]=1;
39         m[2][1]=0;
40         m[2][2]=1;
41     }
42 } e;
43 int  qpow(int n,int f1,int f2,int a,int b)
44 {
45     n--;
46     e.m[0][0]=1;
47     e.m[1][1]=1;
48     e.m[2][2]=1;
49     matrix temp,ans;
50     ans=e;
51     temp.set(a,b);
52     while(n)
53     {
54         if(n&1)
55             ans=ans*temp;
56         temp=temp*temp;
57         n>>=1;
58     }
59     long long fn=(ans.m[1][0]*f1+ans.m[1][1]*f2)%mod;
60     long long sum=(ans.m[2][0]*f1+ans.m[2][1]*f2+ans.m[2][2]*f2)%mod;
61     printf("%I64d %I64d\n",fn,sum);
62     return fn;
63 }
64 int main()
65 {
66     int i;
67     for(i=1;i<=10;i++)
68         printf("%d\n",qpow(i,1,1,1,1));
69     return 0;
70 }

 

矩阵快速幂 模板