hit2255 Not Fibonacci

26 篇文章 0 订阅

(http://acm.hit.edu.cn/hoj/problem/view?id=2255)

我直接构造矩阵,s(n)=s(n-1)+f(n-1)+f(n-2);

这里写图片描述

这里写图片描述

f(1)=b, f(0)=a, s(1)=a+b;
a和b的值可能为负,所以要 (x%mod+mod)%mod,防止负数;

/*This Code is Submitted by 1229836201 for Problem 2255 at 2015-08-14 16:55:36*/
#include <iostream>
#define mod 10000000
using namespace std;
const int Max=3;
typedef struct
{
    long long m[Max][Max];
} Matrix;

Matrix P={0,0,0,//不能把p,q写在这,要在主函数里输入
          1,0,0,
          0,0,1};
Matrix I={1,0,0,
          0,1,0,
          0,0,1};
Matrix matrixmul(Matrix a,Matrix b)
{
    Matrix c;
    for(int i=0;i<Max;i++)
      for(int j=0;j<Max;j++)
        {
            c.m[i][j]=0;
            for(int k=0;k<Max;k++)
            {
                a.m[i][k]=(a.m[i][k]%mod+mod)%mod;
                b.m[k][j]=(b.m[k][j]%mod+mod)%mod;
                c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;
            }
            c.m[i][j]=(c.m[i][j]%mod+mod)%mod;
        }
    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()
{long long a,b,p,q,s,e;
 long long sum,sum1;
 int t;
 Matrix tmp,tmp1;
 cin>>t;
 while(t--)
 {
     cin>>a>>b>>p>>q>>s>>e;
     P.m[0][0]=p;
     P.m[0][1]=q;
     P.m[2][0]=p;
     P.m[2][1]=q;
     if(e>=2)
     {
         tmp=quickpow(e-1);
         sum=(tmp.m[2][0]*b)%mod+(tmp.m[2][1]*a)%mod+(tmp.m[2][2]*(a+b))%mod;
         sum=(sum%mod+mod)%mod;
     }
     if(e==1)//讨论边界
     sum=((a+b)%mod+mod)%mod;
     if(e==0)
     sum=(a%mod+mod)%mod;
     if(s>=3)
     {
         tmp1=quickpow(s-2);
         sum1=(tmp1.m[2][0]*b)%mod+(tmp1.m[2][1]*a)%mod+(tmp1.m[2][2]*(a+b))%mod;
         sum1=(sum1%mod+mod)%mod;
     }
     if(s==0)
     sum1=0;
     if(s==1)
     sum1=(a%mod+mod)%mod;
     if(s==2)
     sum1=((a+b)%mod+mod)%mod;
     long long ans=(sum-sum1+mod)%mod;
     cout<<ans<<endl;
 }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值