1182 E. Product Oriented Recurrence
.
.
.
.
#include<bits/stdc++.h>
#define me(a,x) memset(a,x,sizeof(a))
#define sc scanf
#define itn int
using namespace std;
const int N=1e6;
const long long mod=1e9+7;
const long long M=1e9+6;
const int oo=0x7fffffff;
const int sup=0x80000000;
typedef long long ll;
typedef unsigned long long ull;
template <typename it>void db(it *begin,it *end){while(begin!=end)cout<<(*begin++)<<" ";puts("");}
template <typename it>
string to_str(it n){string s="";while(n)s+=n%10+'0',n/=10;reverse(s.begin(),s.end());return s;}
template <typename it>int o(it a){cout<<a<<endl;return 0;}
ll mul(ll a,ll b,ll c){ll ans=0;for(;b;b>>=1,a=(a+a)%c)if(b&1)ans=(ans+a)%c;return ans;}
ll ksm(ll a,ll b,ll c){ll ans=1;for(;b;b>>=1,a=mul(a,a,c))if(b&1)ans=mul(ans,a,c);return ans;}
ll C[]={14,6,2,7,1};
ll f[4][3]={0,0,0,2,1,1,3,2,1,4,2,1};
auto md=[](ll num){
return (num%M+M)%M;
};
struct mat{
ll m[5][5];
mat(){me(m,0);}
}F[2];
mat mulmat(mat a,mat b,int n){
mat t;mat();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
t.m[i][j]+=a.m[i][k]*b.m[k][j];
t.m[i][j]=md(t.m[i][j]);
}
}
}
return t;
}
mat km(mat a,ll b,int n){
mat ans;mat();
for(int i=0;i<n;i++)ans.m[i][i]=1;
for(;b;b>>=1,a=mulmat(a,a,n))if(b&1)ans=mulmat(ans,a,n);
return ans;
}
void pre(){
mat();
F[0].m[0][0]=F[0].m[0][1]=F[0].m[0][2]=1;F[0].m[0][3]=2,F[0].m[0][4]=-6;
F[0].m[1][0]=F[0].m[2][1]=F[0].m[3][3]=F[0].m[3][4]=F[0].m[4][4]=1;
F[1].m[0][0]=F[1].m[0][1]=F[1].m[0][2]=F[1].m[1][0]=F[1].m[2][1]=1;
}
ll n,f1,f2,f3,c;
int main(){
//freopen("in.txt","r",stdin);
pre();
cin>>n>>f1>>f2>>f3>>c;
auto cal=[](ll x,ll y,ll z,ll w){
return ksm(c,x,mod)*ksm(f1,y,mod)%mod*ksm(f2,z,mod)%mod*ksm(f3,w,mod)%mod;
};
if(n==4)return o(cal(2,1,1,1));
if(n==5)return o(cal(6,1,2,2));
if(n==6)return o(cal(14,2,3,4));
F[0]=km(F[0],n-6,5);
F[1]=km(F[1],n-6,3);
ll x=0,y=0,z=0,w=0;
for(int i=0;i<5;i++){
x+=F[0].m[0][i]*C[i];
x=md(x);
}
for(int i=0;i<3;i++){
y+=F[1].m[0][i]*f[1][i];
z+=F[1].m[0][i]*f[2][i];
w+=F[1].m[0][i]*f[3][i];
y=md(y),z=md(z),w=md(w);
}
return o(cal(x,y,z,w));
}
京公网安备 11010502036488号