51nod 1242 斐波那契數列的第N項
阿新 • • 發佈:2018-11-12
斐波那契數列的定義如下:
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的結果即可。
輸入
輸入1個數n(1 <= n <= 10^18)。
輸出
輸出F(n) % 1000000009的結果。
輸入樣例
11
輸出樣例
89
矩陣快速冪。
程式碼:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define mod 1000000009 using namespace std; void mul(long long (*a)[2],long long (*b)[2]) { long long d[2][2] = {0}; for(int i = 0;i < 2;i ++) { for(int j = 0;j < 2;j ++) { for(int k = 0;k < 2;k ++) { d[i][j] += (a[i][k] * b[k][j]) % mod; } d[i][j] %= mod; } } for(int i = 0;i < 2;i ++) { for(int j = 0;j < 2;j ++) { a[i][j] = d[i][j]; } } } int f(long long n) { long long a[2][2] = {1,1,1,0},d[2][2] = {1,0,0,1}; while(n) { if(n % 2)mul(d,a); n /= 2; mul(a,a); } return d[1][0]; } int main() {long long n; cin>>n; cout<<f(n); }