题解
思路很简单,但是易错点较多,赛事wa了10多发,心态有点炸 题中要求最小公倍数最大,肯定是所有数的最小公倍数才会最大 可以把所有数的因子求出来,然后进行乘积,注意优化,具体看代码
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 6 ;
const int mod = 1e9 + 9 ;
ll n;
ll a[ maxn] ;
ll primes[ maxn] , cnt;
bool st[ maxn] ;
map< ll, ll> p;
vector< ll> ve;
ll ksm ( ll m, ll k, ll p)
{
ll res = 1 % p, t = m;
while ( k)
{
if ( k& 1 ) res = res * t % p;
t = t * t % p;
k >>= 1 ;
}
return res;
}
void gp ( )
{
for ( int i = 2 ; i <= 1000000 ; i ++ )
{
if ( ! st[ i] ) primes[ cnt ++ ] = i;
for ( int j = 0 ; primes[ j] <= 1000000 / i; j ++ )
{
st[ primes[ j] * i] = true ;
if ( i % primes[ j] == 0 ) break ;
}
}
}
int main ( )
{
gp ( ) ;
scanf ( "%lld" , & n) ;
for ( int i = 1 ; i <= n; i ++ )
{
ll x;
cin >> x;
ve. push_back ( x) ;
}
sort ( ve. begin ( ) , ve. end ( ) ) ;
ve. erase ( unique ( ve. begin ( ) , ve. end ( ) ) , ve. end ( ) ) ;
for ( int i = 0 ; i < ve. size ( ) ; i ++ )
{
for ( int j = 0 ; j < cnt; j ++ )
{
if ( ve[ i] < primes[ j] ) break ;
if ( ve[ i] % primes[ j] == 0 )
{
ll num = 0 ;
while ( ve[ i] % primes[ j] == 0 )
{
ve[ i] / = primes[ j] ;
num ++ ;
}
p[ primes[ j] ] = max ( p[ primes[ j] ] , num) ;
}
}
}
ll ans = 1 ;
for ( auto t: p)
{
ll fir = t. first;
ll sec = t. second;
ans * = ksm ( fir, sec, mod) ;
ans% = mod;
}
printf ( "%lld\n" , ans) ;
return 0 ;
}