这题公式其实非常好推,主要是在幂的指数上取模的时候,应该用欧拉定理,指数上模的应该是MOD对应的欧拉函数值
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MOD=1e9+7; 5 const int MAX=2e5+5; 6 LL ans,n,a[MAX],b[MAX],c[MAX]; 7 LL ksm(LL x,LL y){ 8 LL an=1ll; 9 while (y){ 10 if (y%2==1ll) an=(an*x)%MOD; 11 x=(x*x)%MOD; 12 y/=2ll; 13 } 14 return an; 15 } 16 LL ksm2(LL x,LL y){ 17 LL an=1ll; 18 while (y){ 19 if (y%2==1ll) an=(an*x)%(MOD-1); 20 x=(x*x)%(MOD-1); 21 y/=2ll; 22 } 23 return an; 24 } 25 inline LL read(){ 26 LL an(0ll),x=1ll;char c=getchar(); 27 while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();} 28 while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();} 29 return an*x; 30 } 31 bool cmp(LL x,LL y){ 32 return x<y; 33 } 34 int main(){ 35 freopen ("b.in","r",stdin); 36 freopen ("b.out","w",stdout); 37 int i,j; 38 LL x,y,z,mul=1ll; 39 n=read(); 40 for (i=1;i<=n;i++) a[i]=read(); 41 sort(a+1,a+n+1,cmp); 42 memset(b,0,sizeof(b)); 43 memset(c,0,sizeof(c)); 44 for (i=1;i<=n;i++) 45 if (a[i]!=a[i-1]){ 46 b[++b[0]]=a[i]; 47 c[++c[0]]=1; 48 } 49 else c[c[0]]++; 50 ans=1ll;bool flag=true; 51 for (i=1;i<=c[0];i++){ 52 mul=(mul*(c[i]+1))%(MOD-1); 53 if ((c[i]+1)%2==0 && flag){ 54 flag=false; 55 mul/=2; 56 } 57 } 58 for (i=1;i<=b[0];i++){ 59 x=c[i]; 60 if (flag) x/=2ll; 61 z=(x*mul%(MOD-1))%(MOD-1); 62 ans=(ans*ksm(b[i],z))%MOD; 63 } 64 printf("%lld",ans); 65 return 0; 66 }