poj3070 求斐波那契数列第n项 ——矩阵快速幂
Posted Zinn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj3070 求斐波那契数列第n项 ——矩阵快速幂相关的知识,希望对你有一定的参考价值。
题目:http://poj.org/problem?id=3070
用矩阵快速幂加速递推。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,p=10000; struct Matrix{ int a[3][3]; Matrix operator * (const Matrix &y) const { Matrix x; memset(x.a,0,sizeof x.a); for(int i=1;i<=2;i++) for(int k=1;k<=2;k++) for(int j=1;j<=2;j++) x.a[i][j]+=y.a[i][k]*a[k][j]; return x; } }m,ans; void mod() { m.a[1][1]%=p;m.a[1][2]%=p;// m.a[2][1]%=p;m.a[2][2]%=p; ans.a[1][1]%=p;ans.a[2][1]%=p; } int main() { while(scanf("%d",&n)==1) { if(n==-1)return 0; memset(m.a,0,sizeof m.a); memset(ans.a,0,sizeof ans.a); m.a[1][1]=1;m.a[1][2]=1; m.a[2][1]=1;m.a[2][2]=0; ans.a[1][1]=1;ans.a[2][1]=1; if(!n){printf("0\n");continue;} if(n==1){printf("1\n");continue;} if(n==2){printf("1\n");continue;} n--;//! while(n) { if(n&1)ans=ans*m; m=m*m; mod(); n=(n>>1); } printf("%d\n",ans.a[2][1]%p); } return 0; }
以上是关于poj3070 求斐波那契数列第n项 ——矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章