HIT OJ 2060 Fibonacci Problem Again(矩阵快速幂)

来源:互联网 发布:淘宝扣分处罚节点 编辑:程序博客网 时间:2024/05/19 15:19

传送门:HIT 2060

题意:求斐波那契数列中第a项到第b项的和。注:f[0]=1。

题解:直接模版。

代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <vector>#include <set>#include <map>using namespace std;const int MAX=2;const long long MOD=1000000000;typedef struct{    long long m[MAX][MAX];}Matrix;Matrix P={0,1,1,1};Matrix I={1,0,0,1};Matrix matrixmul(Matrix a,Matrix b){    int i,j,k;    Matrix c;    for(i=0;i<MAX;i++)        for(j=0;j<MAX;j++)    {        c.m[i][j]=0;        for(k=0;k<MAX;k++)            c.m[i][j]+=(a.m[i][k]*b.m[k][j])%MOD;        c.m[i][j]%=MOD;    }    return c;}Matrix quickpow(int n){    Matrix m=P,b=I;    while(n>=1)    {        if(n&1)            b=matrixmul(b,m);        n=n>>1;        m=matrixmul(m,m);    }    return b;}int main(){    long long a,b,k1,k2,ans;    Matrix fa,fb;    while(cin>>a>>b)    {        if(a==0&&b==0) break;        fa=quickpow(a+2-1);        fb=quickpow(b+2);        k1=(fa.m[0][0]+fa.m[0][1])%MOD;        k2=(fb.m[0][0]+fb.m[0][1])%MOD;        ans=k2-k1;        if(ans<0) ans+=1000000000;//对负数取余,取余后加MOD        cout<<ans<<endl;    }    return 0;}


0 0
原创粉丝点击