#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
struct matrix{
ll x[5][5];
};
matrix multi(matrix a,matrix b){
matrix temp;
memset(temp.x,0,sizeof(temp.x));
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
for(int k=0;k<5;k++)
{
temp.x[i][j]+=a.x[i][k]*b.x[k][j];
temp.x[i][j]%=mod;
}
return temp;
}
matrix quick_multi(matrix a,ll n)//矩阵快速幂
{
matrix temp=a;
n--;
while(n){
if(n&1)
temp=multi(temp,a);
a=multi(a,a);
n>>=1;
}
return temp;
}
/*void p(matrix a)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
printf("%lld ",a.x[i][j]);
printf("\n");
}
}*/
int main()
{
ll n;
ll a0,ax,ay,b0,bx,by;
while(scanf("%lld",&n)!=EOF)
{
matrix A;
scanf("%lld%lld%lld",&a0,&ax,&ay);
scanf("%lld%lld%lld",&b0,&bx,&by);
memset(A.x,0,sizeof(A.x));
if(n<=1) n==1?printf("%lld\n",(a0*b0)%mod):printf("0\n");
else
{
A.x[0][0]=1;A.x[0][1]=(ax*bx)%mod;A.x[0][2]=(ax*by)%mod;A.x[0][3]=(bx*ay)%mod;A.x[0][4]=(ay*by)%mod;
A.x[1][1]=(ax*bx)%mod;A.x[1][2]=(ax*by)%mod;A.x[1][3]=(bx*ay)%mod;A.x[1][4]=(ay*by)%mod;
A.x[2][2]=ax%mod;A.x[2][4]=ay%mod;
A.x[3][3]=bx%mod;A.x[3][4]=by%mod;
A.x[4][4]=1;
matrix B;
memset(B.x,0,sizeof(B.x));
B.x[0][0]=(a0*b0)%mod;B.x[1][0]=(a0*b0)%mod;B.x[2][0]=a0%mod;B.x[3][0]=b0%mod;B.x[4][0]=1;
A=quick_multi(A,n-1);
B=multi(A,B);
printf("%lld\n",B.x[0][0]%mod);
}
}
return 0;
}
Arc of Dream HDU - 4686
猜你喜欢
转载自blog.csdn.net/Miranda_ymz/article/details/81611351
今日推荐
周排行