NWU_ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 1 #include <bits/stdc++.h>
 2 #define _xx ios_base::sync_with_stdio(0);cin.tie(0);
 3 using namespace std;
 4 typedef long long ll;
 5 const ll p = 1000000009ll;
 6 struct node
 7 {
 8     ll data[2][2];
 9 };
10 node operator * (const node& t1, const node& t2)
11 {
12     node ans;
13     for(int i = 0; i < 2; i++)
14     {
15         for(int j = 0; j < 2; j++)
16         {
17             ans.data[i][j] = 0;
18             for(int k = 0; k < 2; k++)
19                 ans.data[i][j] += t1.data[i][k]*t2.data[k][j];
20                 ans.data[i][j] %= p;
21         }
22     }
23     return ans;
24 }
25 node operator % (const node& t1, const ll& p)
26 {
27     node ans;
28     for(int i = 0; i < 2; i++)
29         for(int j = 0; j < 2; j++)
30             ans.data[i][j] = t1.data[i][j]%p;
31     return ans;
32 }
33 node fastm(node a, ll b)
34 {
35     node ans;
36     for(int i = 0; i < 2; i++)
37         for(int j = 0; j < 2; j++)
38             if(i == j) ans.data[i][j] = 1;
39             else ans.data[i][j] = 0;
40     while(b)
41     {
42         if(b%2 == 1)
43         {
44             ans = ans*a;
45             ans = ans%p;
46         }
47         a = a*a;
48         a = a%p;
49         b /= 2;
50     }
51     return ans;
52 }
53 int main()
54 {_xx
55     ll n;
56     cin >> n;
57     if(n == 0) cout << 0 << endl;
58     else if(n == 1) cout << 1 << endl;
59     else
60     {
61         node a, b;
62         for(int i = 0; i < 2; i++)
63             for(int j = 0; j < 2; j++)
64                 b.data[i][j] = a.data[i][j] = 0;
65         a.data[1][0] = a.data[2][0] = 1;
66         b.data[0][1] = b.data[1][0] = b.data[1][1] = 1;
67         b = fastm(b, n - 1);
68         a = b*a;
69         cout << a.data[1][0]%p << endl;
70     }
71     return 0;
72 }
View Code

 

posted on 2017-03-29 17:30  NWU_ACM  阅读(649)  评论(0编辑  收藏  举报