E. Product Oriented Recurrence(矩阵快速幂+欧拉降幂)
#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; }
希望用自己的努力为自己赢得荣誉。