POJ 3070 Fibonacci(矩阵乘法logN)
2012-11-28 12:31
423 查看
题意:
求第n个斐波那契数,结果mod10000.
思路:
矩阵的n次方可以由二分法来解决,于是把时间缩短到了logN
求第n个斐波那契数,结果mod10000.
思路:
矩阵的n次方可以由二分法来解决,于是把时间缩短到了logN
#include <cstdio> #include <cstdlib> #include <cstring> const int M = 10000; typedef struct _Matrix { int v[2][2]; } Matrix; Matrix m; Matrix matrix_mul(Matrix a, Matrix b) { Matrix c; c.v[0][0] = (a.v[0][0] * b.v[0][0] + a.v[0][1] * b.v[1][0]) % M; c.v[0][1] = (a.v[0][0] * b.v[0][1] + a.v[0][1] * b.v[1][1]) % M; c.v[1][0] = (a.v[1][0] * b.v[0][0] + a.v[1][1] * b.v[1][0]) % M; c.v[1][1] = (a.v[1][0] * b.v[0][1] + a.v[1][1] * b.v[1][1]) % M; return c; } Matrix matrix_pow(Matrix b, int n) { if (n == 1) return b; Matrix c = matrix_pow(b, n >> 1); if (n % 2) return matrix_mul(matrix_mul(c, c), m); else return matrix_mul(c, c); } int main() { int n; m.v[0][0] = 1, m.v[0][1] = 1; m.v[1][0] = 1, m.v[1][1] = 0; while (scanf("%d", &n) && n != -1) { if (n == 0) { printf("0\n"); continue; } Matrix b; b = matrix_pow(m, n); printf("%d\n", b.v[1][0]); } return 0; }
相关文章推荐
- poj 3070 Fibonacci (快速矩阵乘法)
- Fibonacci - POJ 3070 矩阵乘法快速幂
- POJ ---3070 (矩阵乘法求Fibonacci 数列)
- POJ-3070 Fibonacci 矩阵乘法
- 【POJ】3070 Fibonacci(矩阵乘法)
- [POJ 3070] Fibonacci · 矩阵乘法
- poj 3070 Fibonacci 【矩阵乘法】
- poj 3070 Fibonacci(矩阵乘法快速幂)
- poj 3070 Fibonacci(矩阵快速幂,简单)
- Fibonacci - POJ 3070 - 矩阵快速幂
- poj 3070 矩阵乘法
- POJ 3070 Fibonacci (矩阵快速幂)
- POJ 3070 Fibonacci(矩阵快速幂)
- poj 3070 Fibonacci 矩阵基础题
- Poj 3070 Fibonacci (矩阵快速幂 )
- POJ 3070 - Fibonacci (矩阵快速幂)
- poj 3070 Fibonacci 矩阵快速幂
- poj 3070 Fibonacci【矩阵斐波拉切】
- POJ 3070 Fibonacci 矩阵快速幂
- POJ 3070 Fibonacci (矩阵快速幂)