🦍 🦍 🦍
题意:给定一个长度为nn的数组,求gcd{lcm(ai,aj)|i<j}
性质:
两个整数的最大公因子和最小公倍数中存在分配律:
- gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))
- lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))
*由此推得
gcd1=gcd(lcm(a1,a2)、lcm(a1,a3)、…lcm(a1,an)) = lcm(a1,gcd(a2,a3,…an))
gcd2=gcd(lcm(a2,a3)、lcm(a2,a4)、…lcm(a2,an)) = lcm(a2,gcd(a3,a3,…an))
…
答案即为: gcd(gcd1,gcd2,…gcdn)
#define int ll
int a[MX], gcd[MX];
void solve()
{
int n;
cin >> n;
rpp(i, n) cin >> a[i];
for (int i = n; i >= 1; --i) gcd[i] = __gcd(gcd[i + 1], a[i]);
int ans = 0;
rpp(i, n) ans = __gcd(ans, (a[i] * gcd[i + 1] / __gcd(a[i], gcd[i + 1])));
cout << ans << endl;
}