51NOD 1242 斐波那契数列的第N项

1242 斐波那契数列的第N项

斐波那契数列的定义如下:
 
F(0) = 0
F(1) = 1
F(n) = F(n - 1) + F(n - 2) (n >= 2)
 
(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)
给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。
Input
输入1个数n(1 <= n <= 10^18)。
Output
输出F(n) % 1000000009的结果。
Input示例
11
Output示例
89

矩阵快速幂
 1 #include <iostream>
 2 #define mod 1000000009
 3 #define N 2
 4 using namespace std;
 5 struct node{
 6     long long int num[N][N];
 7 };
 8 node mul(node a,node b){
 9     node sum;
10     for(int i=0;i<N;i++){
11         for(int j=0;j<N;j++){
12             sum.num[i][j]=0;
13             for(int k=0;k<N;k++){
14                 sum.num[i][j]+=a.num[i][k]*b.num[k][j];
15                 sum.num[i][j]%=mod;
16             }
17         }
18     }
19     return sum;
20 }
21 
22 int main(){
23     cin.sync_with_stdio(false);
24     long long int n;
25     while(cin>>n){
26         node sum,num;
27         num.num[0][0]=1;
28         num.num[0][1]=1;
29         num.num[1][0]=1;
30         num.num[1][1]=0;
31         sum.num[0][0]=1;
32         sum.num[0][1]=1;
33         sum.num[1][0]=1;
34         sum.num[1][1]=0;
35         n=n-2;
36         while(n>0){
37             if(n&1){
38                 sum=mul(sum,num);
39             }
40             num=mul(num,num);
41             n>>=1;
42         }
43         cout<<sum.num[0][0]<<endl;
44     }
45     return 0;
46 }

 

posted @ 2016-12-07 21:40  ガ落涙『不變』  阅读(95)  评论(0编辑  收藏  举报