#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define mod 1000007
typedef long long LL;
struct zp
{
LL Map[3][3];
};
zp jx(zp a,zp b)//矩阵相乘
{
zp p;
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
{
p.Map[i][j]=0;
for(int k=0; k<3; k++)
{
p.Map[i][j]+=a.Map[i][k]*b.Map[k][j];
p.Map[i][j]=(p.Map[i][j]+mod)%mod;
}
}
return p;
}
zp jk(zp a,LL n)//矩阵快速幂
{
zp x;
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
x.Map[i][j]=(i==j);
while(n)
{
if(n&1)
x=jx(x,a);
a=jx(a,a);
n>>=1;
}
return x;
}
int main()
{
LL z;
scanf("%lld",&z);
while(z--)
{
LL f1,f2,a,b,c,n;
scanf("%lld%lld%lld%lld%lld%lld",&f1,&f2,&a,&b,&c,&n);
zp res,yuan;
res.Map[0][0]=b,res.Map[0][1]=1,res.Map[0][2]=0;//初始化矩阵
res.Map[1][0]=a,res.Map[1][1]=0,res.Map[1][2]=0;
res.Map[2][0]=c,res.Map[2][1]=0,res.Map[2][2]=1;
yuan.Map[0][0]=f2,yuan.Map[0][1]=f1,yuan.Map[0][2]=1;
if(n>=3)
{
zp x=jk(res,n-2);
printf("%lld\n",(f2*x.Map[0][0]+f1*x.Map[1][0]+x.Map[2][0]+mod)%mod);
}
else if(n==1)
printf("%lld\n",(f1+mod)%mod);
else if(n==2)
printf("%lld\n",(f2+mod)%mod);
else
printf("%lld\n",(((f2-c-b*f1)/a)+mod)%mod);
}
}
矩阵快速幂
最新推荐文章于 2025-06-01 00:01:08 发布