Description
Input
第一行一个正整数n,表示序列长度
第二行n个正整数,为给出的序列A
Output
一个非负整数,为答案。
Sample Input
3
6 4 12
Sample Output
13824
Data Constraint
50%:n<=3000;
100%:n<=30000,A[i]<=10^7
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 30010
#define MA 10000010
#define ll long long
#define M 100000000009
using namespace std;
ll ans=1;
ll n,m,x,y,a[N],s[N*18],p[N*18],k[N*18],tot=0;
bool bz[MA];
void qs(int l,int r){
int i=l,j=r,m=p[(l+r)/2],m2=k[(l+r)/2];
while(i<=j){
while(m>p[i]||(m==p[i]&&m2>k[i])) i++;
while(m<p[j]||(m==p[j]&&m2<k[j])) j--;
if(i<=j){swap(p[i],p[j]);swap(k[i],k[j]);i++;j--;}
}
if(l<j) qs(l,j);
if(i<r) qs(i,r);
}
ll ksc(ll x,ll y){
ll sum=0;
while(y){
if(y&1) sum=(sum+x)%M;
x=(x*2)%M;y>>=1;
}
return sum;
}
ll ksm(ll x,ll o){
if(o==0) return 1;
if(o==1) return x%M;
ll t=ksm(x,o/2);
if(o%2==0){return ksc(t,t);}
else{return ksc(ksc(t,t),x);}
}
void fen(int x){
for(int i=1;i<=s[0];i++){
if(x==1) return;
if(x%s[i]==0){
p[++p[0]]=s[i];
while(x%s[i]==0){x/=s[i];k[p[0]]++;}
}
}
if(x>1) p[++p[0]]=x,k[p[0]]=1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){scanf("%d",&a[i]);m=max(m,a[i]);}
for(int i=2;i<=3200;i++){
if(!bz[i]) s[++s[0]]=i;
for(int j=1;j<=s[0]&&i*s[j]<=m;j++){
bz[i*s[j]]=1;
if(i%s[j]==0) break;
}
}
for(int i=1;i<=n;i++) fen(a[i]);
qs(1,p[0]);
for(int i=1;i<=p[0];i++){
if(p[i]==p[i+1]) {k[i+1]+=k[i],tot+=k[i];}
else{ans=ksc(ans,ksm((ll)p[i],(ll)tot+k[i]));tot=0;}
}
printf("%lld\n",ans);
return 0;
}