51nod 1242 斐波那契数列的第N项 (矩阵快速幂)

来源:互联网 发布:iphone打电话变声软件 编辑:程序博客网 时间:2024/05/09 14:49


斐波那契数列的定义如下:

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 <iostream>#include <algorithm>#include <cmath>#define MOD 1000000009#define N 2using namespace std;struct Matrix {long long v[N][N];};Matrix matrix_mul(Matrix A, Matrix B, long long m){Matrix ans;for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){ans.v[i][j] = 0;for (int k = 0; k < N; k ++){ans.v[i][j] += (A.v[i][k] * B.v[k][j]) % m;}ans.v[i][j] %= m;}}return ans;}Matrix matrix_pow(Matrix C, long long n, long long m){Matrix ans = {1, 0, 0, 1};while (n){if (n & 1)ans = matrix_mul(ans, C, m);C = matrix_mul(C, C, m);n >>= 1;}return ans;}int main(){long long n;Matrix temp1 = {1, 1, 1, 0}, temp2 = {1, 0, 1, 0}; // temp2{f[2],0,f[1],0}!!!!!   temp1[a,b,1,0] ---> f[n]=a*f[n-1]+b*f[n-2]while (cin >> n){if (n < 2){cout << 1 << endl;continue;}Matrix res = matrix_pow(temp1, n - 2, MOD);res = matrix_mul(res, temp2, MOD);cout << res.v[0][0] << endl;}return 0;}





0 0
原创粉丝点击