矩阵快速幂

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int mod = 10003;
 5 const int num = 2;
 6 
 7 struct mat {
 8     long long m[num][num];
 9 };
10 
11 
12 
13 mat mul(mat a, mat b) {
14     mat ans;
15     for (int i = 0; i<num; i++)
16         for (int j = 0; j < num; j++) {
17             ans.m[i][j] = 0;
18             for (int k = 0; k < num; k++)
19                 ans.m[i][j] += (a.m[i][k] * b.m[k][j]);
20             ans.m[i][j] %= mod;
21         }
22     return ans;
23 }
24 
25 mat quick_pow(mat a, long long b) {
26     mat ans{
27         1,0,
28         0,1
29     };
30     mat tmp = a;
31 
32     while (b>0) {
33         if (b & 1)
34             ans = mul(ans, tmp);
35         tmp = mul(tmp, tmp);
36         b >>= 1;
37     }
38     return ans;
39 }
40 
41 int main() {
42     int n;
43     while (cin>>n)
44     {
45         mat a{
46             1,1,
47             1,0
48         };
49         mat ans = quick_pow(a, n);
50         cout << ans.m[0][1] << endl;
51     }
52     return 0;
53 }

 

posted on 2016-11-21 20:05  mkfoy  阅读(200)  评论(0编辑  收藏  举报

导航