您的位置:首页 > 其它

hit2255 Not Fibonacci

2015-08-15 17:23 281 查看
(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: