文件详细信息
本文件的大小为 1316 字节。
#include<cstdio>
#include<cstring>
typedef long long ll;
const ll P=1000000007;
struct Matrix{
ll a[5][5];
Matrix(){
memset(a,0,sizeof(a));
}
}I,init_c,init_1,init_2,init_3,trans_c,trans_f;
Matrix operator*(const Matrix a,const Matrix b){
Matrix ans;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
for(int k=0;k<5;k++)
ans.a[i][k]=(ans.a[i][k]+a.a[i][j]*b.a[j][k])%(P-1);
return ans;
}
Matrix qpow(Matrix a,ll x){
Matrix ans=I;
while(x){
if(x&1)ans=ans*a;
a=a*a;
x>>=1;
}
return ans;
}
ll qpow(ll a,ll x){
ll ans=1;
while(x){
if(x&1)ans=ans*a%P;
a=a*a%P;
x>>=1;
}
return ans;
}
ll n,f1,f2,f3,c;
int main(){
I.a[0][0]=I.a[1][1]=I.a[2][2]=I.a[3][3]=I.a[4][4]=1;
init_c.a[0][4]=1;
init_1.a[0][0]=1;
init_2.a[0][1]=1;
init_3.a[0][2]=1;
trans_c.a[0][2]=trans_c.a[1][0]=trans_c.a[1][2]=trans_c.a[2][1]=trans_c.a[2][2]=trans_c.a[3][2]=trans_c.a[3][3]=trans_c.a[4][4]=1;
trans_c.a[4][2]=trans_c.a[4][3]=2;
trans_f.a[0][2]=trans_f.a[1][0]=trans_f.a[1][2]=trans_f.a[2][1]=trans_f.a[2][2]=1;
scanf("%lld%lld%lld%lld%lld",&n,&f1,&f2,&f3,&c);
ll _c=(init_c*qpow(trans_c,n-3)).a[0][2];
Matrix temp=qpow(trans_f,n-3);
ll _f1=(init_1*temp).a[0][2],_f2=(init_2*temp).a[0][2],_f3=(init_3*temp).a[0][2];
printf("%lld\n",qpow(c,_c)*qpow(f1,_f1)%P*qpow(f2,_f2)%P*qpow(f3,_f3)%P);
return 0;
}