UVA 10229 Modular Fibonacci (矩阵乘法+快速幂)

来源:互联网 发布:yes风淘宝客程序下载 编辑:程序博客网 时间:2024/04/28 17:27

题目:http://uva.onlinejudge.org/external/102/10229.pdf

题意:给你n和m,求出Fibonacci数列的第n项F(n)模2^m。

分析:由于n<=2 147 483 647,直接递推打表会超时。用矩阵快速幂比较好~

代码:

#include <iostream>#include <cstdio>#include <cmath>using namespace std;struct Matrax{long long mat[2][2];}U,F;long long MOD;void init(){U.mat[0][0]=1;U.mat[0][1]=0;U.mat[1][0]=0;U.mat[1][1]=1;F.mat[0][0]=0;F.mat[0][1]=1;F.mat[1][0]=1;F.mat[1][1]=1;} Matrax multi(Matrax a,Matrax b){Matrax ans;int i,j,k;for(i=0;i<2;i++){for(j=0;j<2;j++){ans.mat[i][j]=0;for(k=0;k<2;k++)ans.mat[i][j]+=a.mat[i][k]*b.mat[k][j];ans.mat[i][j]%=MOD; }}return ans;}Matrax kpow(int n){Matrax ans=U,p=F;while(n){if(n&1)ans=multi(ans,p);n>>=1;p=multi(p,p); }return ans;}int main(){init();int n,m;while(scanf("%d%d",&n,&m)!=EOF){MOD=1LL<<m;Matrax ans=kpow(n);printf("%d\n",ans.mat[1][0]);}return 0;} 


0 0