Skip to content

Commit 2824579

Browse files
authored
Merge pull request #1517 from AlgorithmWithGod/khj20006
[20251126] BOJ / P4 / 공약수 (More Huge) / 권혁준
2 parents 932e41e + 09a5632 commit 2824579

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
```cpp
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
using ll = long long;
5+
6+
int Q;
7+
ll G, L, X;
8+
vector<ll> g, l, x, r1, r2;
9+
10+
void bck(int pos, int tar, ll cur, vector<ll> &r) {
11+
if(pos == tar) {
12+
if(cur > 1) r.push_back(cur);
13+
return;
14+
}
15+
bck(pos+1, tar, cur, r);
16+
cur *= x[pos];
17+
bck(pos+1, tar, cur, r);
18+
}
19+
20+
int main(){
21+
cin.tie(0)->sync_with_stdio(0);
22+
23+
for(cin>>Q;Q--;) {
24+
int n1, n2;
25+
26+
cin>>n1;
27+
g.resize(n1);
28+
G = 1;
29+
for(ll &i : g) {
30+
cin>>i;
31+
G *= i;
32+
}
33+
34+
cin>>n2;
35+
l.resize(n2);
36+
L = 1;
37+
for(ll &i : l) {
38+
cin>>i;
39+
L *= i;
40+
}
41+
42+
sort(g.begin(), g.end());
43+
sort(l.begin(), l.end());
44+
45+
x = vector<ll>();
46+
for(ll i : g) for(auto it = l.begin(); it != l.end(); it++) {
47+
if(*it == i) {
48+
l.erase(it);
49+
break;
50+
}
51+
}
52+
53+
for(int i=0;i<l.size();) {
54+
ll res = 1;
55+
int j=i;
56+
while(j<l.size() && l[i]==l[j]) res *= l[j++];
57+
x.push_back(res);
58+
i = j;
59+
}
60+
61+
r1 = vector<ll>();
62+
r2 = vector<ll>();
63+
64+
bck(0, x.size()/2, 1, r1);
65+
bck(x.size()/2, x.size(), 1, r2);
66+
67+
sort(r1.begin(), r1.end());
68+
sort(r2.begin(), r2.end(), greater<>());
69+
70+
ll sq = sqrtl(L/G);
71+
int idx = 0;
72+
ll mn = 1+L/G, ans1 = 1, ans2 = L/G;
73+
for(ll i : r1) {
74+
while(idx < r2.size() && i*r2[idx] >= sq) idx++;
75+
if(idx < r2.size()) {
76+
ll val = r2[idx]*i + L/G/(r2[idx]*i);
77+
ll aa = min(r2[idx]*i, L/G/(r2[idx]*i));
78+
ll bb = max(r2[idx]*i, L/G/(r2[idx]*i));
79+
if(val < mn || (val == mn && ans1 > aa)) {
80+
ans1 = aa, ans2 = bb, mn = val;
81+
}
82+
}
83+
if(idx > 0) {
84+
ll val = r2[idx-1]*i + L/G/(r2[idx-1]*i);
85+
ll aa = min(r2[idx-1]*i, L/G/(r2[idx-1]*i));
86+
ll bb = max(r2[idx-1]*i, L/G/(r2[idx-1]*i));
87+
if(val < mn || (val == mn && ans1 > aa)) {
88+
ans1 = aa, ans2 = bb, mn = val;
89+
}
90+
}
91+
{
92+
ll val = i + L/G/i;
93+
ll aa = min(i, L/G/i);
94+
ll bb = max(i, L/G/i);
95+
if(val < mn || (val == mn && ans1 > aa)) {
96+
ans1 = aa, ans2 = bb, mn = val;
97+
}
98+
}
99+
idx = max(0, idx-1);
100+
}
101+
for(ll i : r2) {
102+
ll val = i + L/G/i;
103+
ll aa = min(i, L/G/i);
104+
ll bb = max(i, L/G/i);
105+
if(val < mn || (val == mn && ans1 > aa)) {
106+
ans1 = aa, ans2 = bb, mn = val;
107+
}
108+
}
109+
cout<<G*ans1<<' '<<G*ans2<<'\n';
110+
111+
}
112+
113+
}
114+
```

0 commit comments

Comments
 (0)