nefu 463

 

#include <iostream>
#define val 1000000000;
using namespace std;
const int MAX = 2;
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] =(c.m[i][j]+(a.m[i][k]*b.m[k][j]))%val;
                 c.m[i][j] %= val;
             }
       return c;
}

Matrix quickpow(long long 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()
{
    int n,a,b,ans,m=1000000000;
    Matrix c,c1;
   while(cin>>a>>b)
      {
      if (a==0&&b==0) break;

     c=quickpow(b+2);

     c1= quickpow(a+1);
     //cout<<c.m[0][0]<<endl;
     //cout<<c.m[0][1]<<endl;
     int sum=((c.m[0][0]-c1.m[0][0])%m+(c.m[0][1]-c1.m[0][1])%m)%m;
     //int sum1=c1.m[0][0]%m+c1.m[0][1]%m;

     ans=(sum)%m;
     if (ans<0) ans=ans+m;
     cout<<ans<<endl;
   }

 

 

 

    //cout << "Hello world!" << endl;
    return 0;
}

 //推导出和的递推公式就行

 

 

posted @ 2012-09-28 09:44  兴安黑熊  阅读(184)  评论(0编辑  收藏  举报