文件详细信息

下载本文件

本文件的大小为 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;
}