您的位置:首页 > 其它

POJ 3070 Fibonacci(矩阵乘法logN)

2012-11-28 12:31 423 查看
题意:

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