传送门: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;
}