斐波那契数列的定义如下:
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
构造矩阵= =。
#include <cstdio> #include <algorithm> #include <cmath> #include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MOD=1000000009; struct M { ll p[2][2]; }; M mul(M AA,M BB) { M aa; int i,j,k; memset(aa.p,0,sizeof(aa.p)); for(i=0; i<2; i++) { for(j=0; j<2; j++) { aa.p[i][j]=0; for(k=0; k<2; k++) { aa.p[i][j]+=((AA.p[i][k]*BB.p[k][j])%MOD); } aa.p[i][j]=aa.p[i][j]%MOD; } } return aa; } M kuaisumi(M A,ll n) { M res; memset(res.p,0,sizeof(res.p)); for(int i=0; i<2; i++) res.p[i][i]=1; while(n) { if(n&1) res=mul(res,A); A=mul(A,A); n>>=1; } return res; } int main() { M A= {1,1,1,0}; M B= {1,0,1,0}; ll n; while(~scanf("%lld",&n)) { if(n<=2) { printf("1\n"); continue; } M res=kuaisumi(A,n-2); M ff=mul(res,B); printf("%lld\n",ff.p[0][0]); } return 0; }