1242 斐波那契数列的第N项 运用矩阵快速幂来求解斐波那契数列问题
2017-11-05 20:26
369 查看
斐波那契数列的定义如下:
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
Output
输出F(n) % 1000000009的结果。
用普通的循环会超时的。要用矩阵快速幂
#include <cstdio>
#include <cstring>
#define MOD 1000000009
struct juzhen
{
long long aa[2][2];
};
juzhen chengfa(juzhen &a, juzhen &b)
{
juzhen c;
memset(c.aa,0,sizeof(c.aa));
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
{
for (int k = 0; k < 2; k++)
{
c.aa[i][j] = (c.aa[i][j] + a.aa[i][k] * b.aa[k][j]) % MOD;
}
}
return c;
}
juzhen pow(juzhen a, long long n)
{
juzhen ans;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
if (i == j)
ans.aa[i][j] = 1;
else
ans.aa[i][j] = 0;
while (n)
{
if (n & 1)
ans = chengfa(ans, a);
a = chengfa(a, a);
n /= 2;
}
return ans;
}
int main()
{
long long n;
juzhen a, b;
scanf("%lld", &n);
a.aa[0][0] = a.aa[0][1] = a.aa[1][0] = 1;
a.aa[1][1] = 0;
b = pow(a, n);
printf("%lld\n", b.aa[0][1] % MOD);
return 0;
}
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的结果。
用普通的循环会超时的。要用矩阵快速幂
#include <cstdio>
#include <cstring>
#define MOD 1000000009
struct juzhen
{
long long aa[2][2];
};
juzhen chengfa(juzhen &a, juzhen &b)
{
juzhen c;
memset(c.aa,0,sizeof(c.aa));
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
{
for (int k = 0; k < 2; k++)
{
c.aa[i][j] = (c.aa[i][j] + a.aa[i][k] * b.aa[k][j]) % MOD;
}
}
return c;
}
juzhen pow(juzhen a, long long n)
{
juzhen ans;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
if (i == j)
ans.aa[i][j] = 1;
else
ans.aa[i][j] = 0;
while (n)
{
if (n & 1)
ans = chengfa(ans, a);
a = chengfa(a, a);
n /= 2;
}
return ans;
}
int main()
{
long long n;
juzhen a, b;
scanf("%lld", &n);
a.aa[0][0] = a.aa[0][1] = a.aa[1][0] = 1;
a.aa[1][1] = 0;
b = pow(a, n);
printf("%lld\n", b.aa[0][1] % MOD);
return 0;
}
相关文章推荐
- [51NOD]-1242 斐波那契数列的第N项 [矩阵快速幂]
- 1242 斐波那契数列的第N项(矩阵快速幂)
- 51nod 1242 斐波那契数列的第N项(矩阵快速幂)
- 51nod 1242 斐波那契数列的第N项【矩阵快速幂】
- 51Nod 1242 斐波那契数列的第N项(矩阵快速幂)
- 51 nod 1242 斐波那契数列的第N项 矩阵快速幂
- 【51Nod】1242 - 斐波那契数列的第N项(矩阵快速幂)
- 1242 斐波那契数列的第N项(矩阵快速幂)
- 51nod 1242 斐波那契数列的第N项 (矩阵快速幂)
- 矩阵快速幂1242斐波那契数列的第N项
- 51nod 1242 斐波那契数列的第N项(矩阵快速幂)
- 斐波那契数列的第N项(矩阵快速幂模板)
- #斐波那契数列用矩阵快速幂求解f(n)#
- 【矩阵快速幂】 斐波那契数列求解。
- 51nod--1242 斐波那契数列第N项 (矩阵乘法优化)
- 【51NOD1242】斐波那契数列的第N项(矩阵快速幂)
- 从sicily Fibonacci 问题出发解决矩阵快速幂求解斐波那契问题
- poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)
- 51Nod-斐波那契数列的第N项(矩阵快速幂)
- nod51-1242斐波那契数列-矩阵快速幂