POJ 3070 Fibonacci(快速幂矩阵)
2012-09-19 20:20
330 查看
题目链接
不是很了解,线代的行列式和矩阵乘法,忘的差不多了。。。
这个矩阵的n-1次方的左上角那个数就是菲薄那切数列的第n项。快速幂矩阵,和快速幂模差不多,把数相乘换成矩阵相乘了。
渣代码请无视,改天整理一个模版版本。
不是很了解,线代的行列式和矩阵乘法,忘的差不多了。。。
这个矩阵的n-1次方的左上角那个数就是菲薄那切数列的第n项。快速幂矩阵,和快速幂模差不多,把数相乘换成矩阵相乘了。
渣代码请无视,改天整理一个模版版本。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define MOD 10000 #define LL __int64 int mat[3][3],p[3][3]; void mulp() { int i,j,k; int temp[3][3]; memset(temp,0,sizeof(temp)); for(i = 1;i <= 2;i ++) { for(j = 1;j <= 2;j ++) { for(k = 1;k <= 2;k ++) { temp[i][j] += (mat[i][k]*p[k][j])%MOD; } } } for(i = 1;i <= 2;i ++) { for(j = 1;j <= 2;j ++) mat[i][j] = temp[i][j]%MOD; } } void mulm() { int i,j,k; int temp[3][3]; memset(temp,0,sizeof(temp)); for(i = 1;i <= 2;i ++) { for(j = 1;j <= 2;j ++) { for(k = 1;k <= 2;k ++) { temp[i][j] += (p[i][k]*p[k][j])%MOD; } } } for(i = 1;i <= 2;i ++) { for(j = 1;j <= 2;j ++) p[i][j] = temp[i][j]%MOD; } } void qmod(LL n) { while(n) { if(n&1) mulp(); mulm(); n >>= 1; } } int main() { LL n; while(scanf("%I64d",&n)!=EOF) { if(n < 0) break; p[1][1] = p[1][2] = p[2][1] = 1; p[2][2] = 0; mat[1][1] = mat[2][2] = 1; mat[1][2] = mat[2][1] = 0; if(n == 0) { printf("0\n"); continue; } qmod(n-1); printf("%d\n",mat[1][1]%MOD); } return 0; }
相关文章推荐
- poj 3070 Fibonacci(矩阵乘法快速幂)
- poj3070 Fibonacci ——矩阵快速幂
- poj - 3070 - Fibonacci(矩阵快速幂)
- poj 3070 Fibonacci(矩阵快速幂)
- (Relax 矩阵快速幂1.1)POJ 3070 Fibonacci(求第n个斐波那契数的后四位。n很大)
- 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(矩阵快速幂)
- POJ 3070 Fibonacci 【矩阵快速幂】
- 【POJ 3070 Fibonacci】+ 矩阵快速幂
- poj 3070 Fibonacci(矩阵快速幂)
- 【POJ】3070 - Fibonacci(矩阵快速幂)
- POJ-3070 Fibonacci(矩阵快速幂)
- poj 3070 Fibonacci 矩阵快速幂