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));
}