这里
借鉴了题解(没错只是借鉴)
样例过不了
求条
(上面是我之前写的矩阵类,不用管它)
#define Code using
#define by namespace
#define stringdp100005 std
#include<bits/stdc++.h>
#define int long long
Code by stringdp100005;
const int mod=1e9+7,modd=1e9+6;
class Matrix{
private:
int row,col;
int **val;
public:
Matrix(int x,int y){
row=x,col=y;
val=new int*[row];
for(int i=0;i<row;i++)
val[i]=new int[col];
}
void clear(){
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
val[i][j]=0;
}
}
}
void setIdentity(){
if(row!=col){
cerr<<"[Error]The rows and columns of this matrix are not equal";
return ;
}
clear();
for(int i=0;i<row;i++){
val[i][i]=1;
}
}
int getVal(int x,int y){
return val[x][y];
}
void changeVal(int x,int y,int v){
val[x][y]=v;
}
istream& inputVal(istream& in,int x,int y){
in>>val[x][y];
return in;
}
friend Matrix operator +(Matrix n,Matrix m){
if(n.row!=m.row||n.col!=m.col){
cerr<<"[Error]The rows and columns of these two matrixes are not equal.";
}
Matrix res=Matrix(n.row,n.col);
for(int i=0;i<res.row;i++){
for(int j=0;j<res.col;j++){
res.val[i][j]=n.val[i][j]+m.val[i][j];
}
}
return res;
}
friend Matrix plusMod(Matrix n,Matrix m){
if(n.row!=m.row||n.col!=m.col){
cerr<<"[Error]The rows and columns of these two matrixes are not equal.";
}
Matrix res=Matrix(n.row,n.col);
for(int i=0;i<res.row;i++){
for(int j=0;j<res.col;j++){
res.val[i][j]=(n.val[i][j]+m.val[i][j])%mod;
}
}
return res;
}
friend Matrix operator *(int n,Matrix m){
Matrix res=Matrix(m.row,m.col);
for(int i=0;i<res.row;i++){
for(int j=0;j<res.col;j++){
res.val[i][j]=n*m.val[i][j];
}
}
return res;
}
friend Matrix numMod(int n,Matrix m){
Matrix res=Matrix(m.row,m.col);
for(int i=0;i<res.row;i++){
for(int j=0;j<res.col;j++){
res.val[i][j]=n*m.val[i][j]%mod;
}
}
return res;
}
friend Matrix operator *(Matrix n,Matrix m){
if(n.col!=m.row){
cerr<<"[Error]The columns of the matrix N are not equal to the rows of the matrix M.";
}
Matrix res=Matrix(n.row,m.col);
res.clear();
for(int i=0;i<n.row;i++){
for(int j=0;j<m.col;j++){
for(int k=0;k<n.col;k++){
res.val[i][j]+=n.val[i][k]*m.val[k][j];
}
}
}
return res;
}
friend Matrix mulMod(Matrix n,Matrix m){
if(n.col!=m.row){
cerr<<"[Error]The columns of the matrix N are not equal to the rows of the matrix M.";
}
Matrix res=Matrix(n.row,m.col);
res.clear();
for(int i=0;i<n.row;i++){
for(int j=0;j<m.col;j++){
for(int k=0;k<n.col;k++){
res.val[i][j]=(res.val[i][j]+n.val[i][k]*m.val[k][j]%mod)%mod;
}
}
}
return res;
}
friend Matrix operator ^(Matrix n,int m){
Matrix res=Matrix(n.row,n.row);
res.setIdentity();
while(m){
if(m&1) res=res*n;
n=n*n;
m>>=1;
}
return res;
}
friend Matrix powMod(Matrix n,int m){
Matrix res=Matrix(n.row,n.row);
res.setIdentity();
while(m){
if(m&1) res=mulMod(res,n);
n=mulMod(n,n);
m>>=1;
}
return res;
}
friend istream& operator >>(istream& in,Matrix m){
for(int i=0;i<m.row;i++){
for(int j=0;j<m.col;j++){
in>>m.val[i][j];
}
}
return in;
}
friend ostream& operator <<(ostream& out,Matrix m){
for(int i=0;i<m.row;i++){
for(int j=0;j<m.col;j++){
out<<m.val[i][j]<<" ";
}
out<<endl;
}
return out;
}
};
Matrix ANS1(2,2),ANS2(2,2);
int n,m,a,b,c,d;
string sn,sm;
void init(){
ANS1.clear(),ANS2.clear();
ANS1.changeVal(0,0,a),ANS1.changeVal(1,0,b),ANS1.changeVal(1,1,1);
ANS2.changeVal(0,0,c),ANS2.changeVal(1,0,d),ANS2.changeVal(1,1,1);
}
signed main(){
cin>>sn>>sm>>a>>b>>c>>d;
int lenn=sn.size(),lenm=sm.size();
for(int i=0;i<lenn;i++){
if(a==1) n=(n*10+sn[i]-'0')%mod;
else n=(n*10+sn[i]-'0')%modd;
}
for(int i=0;i<lenm;i++){
if(c==1) m=(m*10+sm[i]-'0')%mod;
else m=(m*10+sm[i]-'0')%modd;
}
init();
ANS1=mulMod(powMod(mulMod(powMod(ANS1,m-1),ANS2),n-1),powMod(ANS1,m-1));
cout<<(ANS1.getVal(0,0)+ANS1.getVal(1,0))%mod;
return 0;
}