矩阵快速幂最主要的是核心矩阵的构建,这题不是构建和每项有关的矩阵,而是构建和前n项和有关的矩阵利用an=sn-sn-1,记住构造的式子里未知数只能有sn,sn-1之类的
#include<stdio.h>
#include<string.h>#include<stdlib.h>
#define mod 10000000
struct juzheng{
long long a[3][3];
};
int ju[3];
juzheng mul(juzheng ch, juzheng th)
{
juzheng ans;
int i,j,k;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
ans.a[i][j]=0;
for(k=0;k<3;k++){
ans.a[i][j]+=(ch.a[i][k]*th.a[k][j]);
}
ans.a[i][j]%=mod;
}
}
return ans;
}
int pow(juzheng ch, int n)
{
juzheng ans;
int i,j;
for(i=0;i<3;i++){//初始化为单位矩阵
for(j=0;j<3;j++){
if(i==j)
ans.a[i][j]=1;
else ans.a[i][j]=0;
}
}
while(n){
if(n%2){
ans=mul(ans,ch);
}
ch=mul(ch,ch);
n/=2;
}
long long zhi=0;
for(i=0;i<3;i++){
zhi+=(ju[i]*ans.a[0][2-i]);
zhi%=mod;
}
return zhi;
}
int main()
{
int num,i,j;
juzheng ch;
scanf("%d",&num);
while(num--){
long long a,b,p,q;
long long s,e;
scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&p,&q,&s,&e);
for(i=0;i<3;i++){//构造出核心矩阵
for(j=0;j<3;j++){
ch.a[i][j]=0;
}
}
ju[0]=a;
ju[1]=a+b;
ju[2]=a+b+p*b+q*a;
ch.a[0][0]=p+1;
ch.a[0][1]=q-p;
ch.a[0][2]=-1*q;
ch.a[1][0]=1;
ch.a[2][1]=1;
long long ss=0,ee=0;
if(s<=3&&s>0){//如果s==0,就可能越界
ss=ju[s-1];
}
else if(s){//不要忘记这个条件,worry了好多次
ss=pow(ch,s-3);
}
if(e<=2){
ee=ju[e];
}
else {
ee=pow(ch,e-2);
}
ee=(ee+mod)%mod;
ss=(ss+mod)%mod;
printf("%d\n",(ee-ss+mod)%mod);
}
return 0;
}