/* -------------------------------------------------------------------- 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 ; }