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;
}

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

 

 

转载于:https://www.cnblogs.com/nefucat/archive/2012/09/28/2706623.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值