这题卡常……加了快读和unique才能过。
首先我们可以知道,最终答案一定是n个数的lcm,lcm的本质就是让所有数都拥有相同的因子,由唯一分解定理可知,这么做一定不会更差。
所以最直接的想法就是直接求n个数的lcm,但是要取模,没法处理,我们得弄新的玩意。又回到唯一分解定理,由第一段可知,我们只要让n个数每个质因子最高次幂乘起来,就是最终答案了,还能取模。
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
int n,a[1000005],mp[100005],maxx,prime[1000005],primes[1000005],len;
const int mod=1e9+9;
inline int readd()
{
int x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
int qpow(int x,int y)
{
int anss=1;
while(y)
{
if(y%2)
{
anss=anss*x%mod;
}
y/=2;
x=x*x%mod;
}
return anss;
}
signed main()
{
n=readd();
for(int i=1;i<=n;i++)
{
a[i]=readd();
maxx=max(maxx,a[i]);
}
sort(a+1,a+n+1);
n=unique(a+1,a+n+1)-(a+1);
for(int i=2;i<=maxx;i++)
{
if(!prime[i])
{
primes[++len]=i;
}
for(int j=1;j<=len&&i*primes[j]<=maxx;j++)
{
prime[i*primes[j]]=1;
if(i%primes[j]==0)break;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=len;j++)
{
if(a[i]==1)break;
if(a[i]%primes[j]==0)
{
int num=0;
while(a[i]%primes[j]==0)a[i]/=primes[j],num++;
mp[primes[j]]=max(mp[primes[j]],num);
}
}
}
int ans=1;
for(int i=2;i<=maxx;i++)
{
if(mp[i])
{
ans=(ans%mod*qpow(i,mp[i]))%mod;
}
}
cout<<ans;
}