51NOD 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 }