目录
Description
有两个数组 \(a,\; b\) ,其中可以对任意 \(i\) 进行 \(swap(a[i],\; b[i])\) 的操作,使得 \(a\) 数组的最大公约数 \(X\),与 \(b\) 数组的最大公约数 \(Y\), 使得 \(LCM(X,\; Y)\) 最大
State
\(1<=a[i],b[i]<=10^{9}\)
\(1<=n<=50\)
Input
2
2 15
10 6
Output
10
Solution
由于最小的质因数
\[2 \; 3 \; 5 \; 7 \; 11\; 13\; 17\; 19\; 23\; 27 \]这些数乘积 \(>10^{9}\) 所以,其所有的因数最多有 \(2^{10}=1024\) 个,这样对 \(a[1],\;b[1]\) 进行因数分解之后,将这些因数作为他们的最大公约数,枚举出最大的 \(LCM\) 就可以了,时间复杂度 \(O(1e6*n)\)
Code
const int N = 2e5 + 5;
ll n, m, _;
int i, j, k;
ll a[N];
ll b[N];
const int N = 2e5 + 5;
ll n, m, _;
int i, j, k;
int a[N];
int b[N];
vector<int> cal(int x)
{
vector<int> ans;
for(ll i = 1; i * i <= x; i++){
if(x % i ==0){
ans.pb(i);
if(i == x / i) continue;
ans.pb(x / i);
}
}
return ans;
}
int judge(int x, int y)
{
rep(i, 2, n){
bool o = (a[i] % x == 0),
oo = (a[i] % y == 0),
ooo = (b[i] % x == 0),
oooo = (b[i] % y == 0);
if(o && oooo) continue;
if(oo && ooo) continue;
return 0;
}
return 1;
}
signed main()
{
//IOS;
while(~ sd(n)){
rep(i, 1, n){
sdd(a[i], b[i]);
}
vector<int> ava = cal(a[1]), eva = cal(b[1]);
ll lcm = 1;
for(auto x : ava){
for(auto y : eva){
int ok = judge(x, y);
if(ok){
lcm = max(lcm, 1ll * x * y / __gcd(x, y));
}
}
}
pll(lcm);
}
return 0;
}