#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
#define ll long long
const int mod = 1e9+7;
const int modd = 1e9+6; //欧拉降幂
ll n,f1,f2,f3,c;
int b[10][10];
struct Mat{ //矩阵快速幂
ll m[10][10];
Mat(){
memset(m,0,sizeof(m));
}
inline void build(int len){
for(int i=1;i<=len;i++)m[i][i]=1;
}
}a;
Mat Mul(Mat x,Mat y,int len){
Mat c;
for(int i=1;i<=len;i++)
for(int j=1;j<=len;j++)
for(int k=1;k<=len;k++)
c.m[j][i]=(c.m[j][i]+x.m[j][k]*y.m[k][i]%modd)%modd; //欧拉降幂
return c;
}
Mat poww(Mat x,ll y,int len){
Mat aa;aa.build(len);
while(y){
if(y&1)aa=Mul(aa,x,len);
x=Mul(x,x,len);
y>>=1;
}
return aa;
}
ll poww2(ll x,ll y){
ll ans=1;
while(y){
if(y&1)ans=(ans*x)%mod;
x=x*x%mod;
y>>=1;
}
return ans%mod;
}
ll wow(Mat s,int k){
if(k==1)return s.m[3][1];
else if(k==2)return s.m[2][1];
else return s.m[1][1];
}
int main()
{
cin>>n>>f1>>f2>>f3>>c;
a.m[1][1]=1,a.m[2][1]=1,a.m[3][1]=1; //构建矩阵
a.m[1][2]=1,a.m[2][2]=0,a.m[3][2]=0;
a.m[1][3]=0,a.m[2][3]=1,a.m[3][3]=0;
Mat ans1=poww(a,n-3,3);
ll ans11=wow(ans1,1),ans12=wow(ans1,2),ans13=wow(ans1,3);
a.m[4][1]=1;a.m[5][1]=0; //构建矩阵2
a.m[4][2]=0;a.m[5][2]=0;
a.m[4][3]=0;a.m[5][3]=0;
a.m[4][4]=1;a.m[5][4]=1;
a.m[4][5]=0;a.m[5][5]=1;
Mat ans2=poww(a,n-3,5);
ll ans22=2*ans2.m[4][1]%modd+2*ans2.m[5][1]%modd; //欧拉降幂
ans22%=modd; //欧拉降幂
printf("%lld",poww2(f1,ans11)*poww2(f2,ans12)%mod*poww2(f3,ans13)%mod*poww2(c,ans22)%mod);
return 0;
}
E. Product Oriented Recurrence(矩阵快速幂+欧拉降幂)
最新推荐文章于 2020-10-14 09:53:00 发布