|
| 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