斐波那契的矩阵快速幂
2014-07-20 10:48
316 查看
斐波那契数列为例 an=an-1+an-2
我们的目的是通过矩阵乘法,求得斐波那契数列的第n项,为了得到这个结果,我们还需要由[an-2 an-1]推得[an-1 an]
我们设[an-2an-1]为矩阵A,因为A1×2B2×2=C1×2,所以C与A是同规模的矩阵
代码(来自CHC大神)
我们的目的是通过矩阵乘法,求得斐波那契数列的第n项,为了得到这个结果,我们还需要由[an-2 an-1]推得[an-1 an]
我们设[an-2an-1]为矩阵A,因为A1×2B2×2=C1×2,所以C与A是同规模的矩阵
代码(来自CHC大神)
#include <cstdio> using namespace std; #define N 2 #define MOD 10000 //斐波那契的矩阵快速幂 // a = a * b void matric_mul(int a[] ,int b[] ) { int i,j,k; int tmp ={0}; for(i=0;i<N;i++) { for(j=0;j<N;j++) { for(k=0;k<N;k++) { tmp[i][j] = (tmp[i][j]+a[i][k]*b[k][j]); } } } for(i=0;i<N;i++) { for(j=0;j<N;j++) { a[i][j] = tmp[i][j]; } } } int quickpow(int n){ //int ans=1,tmp=base; int ans[2][2]={{1,0},{0,1}}; int tmp[2][2]={{0,1},{1,1}}; while(n){ if(n&1) matric_mul(ans,tmp); matric_mul(tmp,tmp); n>>=1; } for(int i=0;i<N;i++){ for(int j = 0;j<N;j++) printf("%d\t",ans[i][j]); printf("\n"); } return ans[0][1]; } int main() { int n; while(~scanf("%d",&n)&&n!=-1) printf(" f[%d] = %d\n",n,quickpow(n)); return 0; }
相关文章推荐
- UVa 10229 Modular Fibonacci (矩阵快速幂求斐波那契)
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
- 斐波那契的矩阵快速幂
- 斐波那契矩阵快速
- 快速矩阵幂求斐波那契数
- POJ3070 斐波那契矩阵快速幂
- [POJ](3070)Fibonacci ---矩阵快速幂与斐波那契
- 斐波那契 矩阵快速幂
- 大数斐波那契【矩阵快速幂】
- POJ 3070(矩阵快速幂,求斐波那契第n项)
- 从sicily Fibonacci 问题出发解决矩阵快速幂求解斐波那契问题
- poj 3070 Fibonacci(矩阵快速幂模板,斐波那契)
- Number Sequence (斐波那契的矩阵快速幂)
- POJ 3070 (矩阵快速幂,矩阵快速幂求斐波那契)
- 继递归递推求斐波那契后的另一种奇妙方法---矩阵乘法+快速幂运算
- 矩阵乘法+快速幂求斐波那契
- HDU 3117Fibonacci Numbers(求斐波那契前四位与后四位 数论知识+矩阵快速幂)
- AOJ 396 矩阵快速幂 + 斐波那契素数
- 10299 Problem A: Modular Fibonacci(斐波那契的矩阵快速幂)
- Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]