您的位置:首页 > 其它

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

2015-10-28 17:08 423 查看
斐波那契数列的定义如下:

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 2
using namespace std;

struct Matrix
{
long long v

;
};

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
=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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: