/*
--------------------------------------------------------------------
stratege:素数筛选 + 整数拆分
一个整数x = p1^a1 + p2 ^ a2 + ... + pn ^ an
其中pi为素数。本题关键是找到存在pi^ai 中 ai的
最大值, 并将pi^ai的结果不断相乘,即为最小公倍数
Author : Johnsondu
2012-03-21 21:51:34 Accepted1007 0 MS976 KB GNU C++
---------------------------------------------------------------------
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
typedef __int64 LL ;
const int maxn = 78500 ;
int prime[7900] ;
int a[maxn], num ;
int mark[maxn] ;
LL res ;
void init ()
{
int i, j, k ;
memset (a, 0, sizeof(a)) ;
num = 1 ;
prime[0] = 2 ;
for (i = 4; i < maxn; i += 2)
a[i] = 1 ;
for (i = 3; i < maxn; i += 2)
{
if (!a[i])
{
prime[num++] = i ;
int tmp = 2 * i ;
while (tmp < maxn)
{
a[tmp] = 1 ;
tmp += i ;
}
}
}
}
int max (int a, int b)
{
return a > b ? a : b ;
}
int main()
{
int i, j, k, tmp ;
unsigned int tcase, n, cnt ;
LL res, ans ;
init () ;
memset (mark, 0, sizeof(mark)) ;
cin >> tcase ;
while (tcase --)
{
cin >> n ;
res = 1 ;
ans = 1 ;
for (i = 0; i < n; i ++)
{
cin >> cnt ;
for (j = 0; j < num; j ++)
{
if (cnt < prime[j])
break ;
tmp = 0 ;
if (cnt % prime[j] == 0)
{
tmp ++ ;
cnt /= prime[j] ;
while (cnt % prime[j] == 0)
{
tmp ++ ;
cnt /= prime[j] ;
}
mark[prime[j]] = max (tmp, mark[prime[j]]) ;
}
}
if (cnt != 1)
ans = cnt ;
}
for (i = 0; i < num; i ++)
if (mark[prime[i]])
{
while (mark[prime[i]] --)
res *= prime[i] ;
}
res *= ans ;
cout << res << endl ;
memset(mark, 0, sizeof(mark)) ;
}
return 0 ;
}
HDU 1019 Least Common Multiple
最新推荐文章于 2018-10-11 21:30:41 发布