矩阵快速幂取模

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const double INF=0x4fffffff;
17 const double EXP=1e-5;
18 const int MS=10;
19 const int SIZE=1000;
20 
21 const int mod=10000007;
22 
23 typedef vector<vector<int> > mat;
24 
25 
26   //  calc   A*B
27 
28   mat mul(mat &A,mat &B)
29   {
30         mat C(A.size(),vector<int>(B[0].size()));
31 
32         for(int i=0;i<A.size();i++)
33         {
34               for(int k=0;k<B.size();k++)
35               {
36                     for(int j=0;j<B[0].size();j++)
37                     {
38                           C[i][j]=(C[i][j]+(LL)A[i][k]*B[k][j])%mod;    //  note
39                     }
40               }
41         }
42         return C;
43   }
44 
45   //   calc  A^n
46 
47 
48   mat pow(mat A,LL n)
49   {
50         mat B(A.size(),vector<int>(A[0].size()));
51         for(int i=0;i<A.size();i++)
52             B[i][i]=1;
53         while(n>0)
54         {
55               if(n&1)
56                   B=mul(B,A);
57               A=mul(A,A);
58               n>>=1;
59         }
60         return B;
61   }
62 
63   LL n;
64 void solve()
65 {
66       mat A(2,vector<int>(2));
67       A[0][0]=A[0][1]=1;
68       A[1][0]=1;A[1][1]=0;
69       A=pow(A,n);
70       printf("%d\n",A[1][0]);
71 }
72 
73 int main()
74 {
75       while(scanf("%lld",&n)==1)
76       {
77             solve();
78       }
79       return 0;
80 }

 

上面的是斐波那契矩阵  求f[n].

 

 

posted @ 2015-04-05 19:11  daydaycode  阅读(100)  评论(0编辑  收藏  举报