一开始感觉是水题,后来根据题意打完后发现似乎有细节
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
#define p 1000000007
using namespace std;
struct matrix{
int m[2][2];
matrix(){memset(m,0,sizeof(m));}
void csh(){memset(m,0,sizeof(m));m[0][0]=m[1][1]=1;}
void csh(int x,int y){
memset(m,0,sizeof(m));
m[0][0]=x,m[1][1]=1,m[1][0]=y;
}
matrix operator *(const matrix &a)const{
matrix ans;
for(int k=0;k<2;k++){
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
ans.m[i][j]=(ans.m[i][j]+(m[i][k]*a.m[k][j]%p))%p;
}
}
}
return ans;
}
matrix operator ^(int b)const{
matrix ans,a;ans.csh();
for(int i=0;i<2;i++)for(int j=0;j<2;j++)a.m[i][j]=m[i][j];
while(b){
if(b&1)ans=ans*a;
a=a*a;
b>>=1;
}
return ans;
}
}A,B,res;
int n,m,a,b,c,d;
signed main(){
scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&a,&b,&c,&d);
A.csh(a,b);B.csh(c,d);
A=A^(m-1);B=A*B;B=B^(n-1);B=B*A;
res.m[0][0]=res.m[0][1]=1;
res=res*B;
printf("%lld",(res.m[0][0]%p));
return 0;
}