#include using namespace std; const int inf = 0x3f3f3f3f; #define all(x) begin(x), end(x) template bool ckmin(T1& a, T2 b) { return a > b ? a = b, true : false; } template bool ckmax(T1& a, T2 b) { return a < b ? a = b, true : false; } const int nmax = 2e5; const int valmax = 2e5 + 5; int spf[valmax + 5]; vector factors[valmax + 5]; int n; int a[nmax + 5]; int b[nmax + 5]; void testcase() { cin >> n; for (int i = 1; i <= n; ++i) { cin >> a[i]; } for (int i = 1; i <= n; ++i) { cin >> b[i]; } vector ord(n); iota(all(ord), 1); sort(all(ord), [&](int i, int j) { return b[i] < b[j]; }); // am incercat operatii pe 2 numere long long answer = b[ord[0]] + b[ord[1]]; map occ; for (int i = 1; i <= n; ++i) { for (auto& p : factors[a[i]]) { if (occ[p] > 0) { // exista si altundeva factorul p answer = 0; // am incercat operatii pe 0 numere } occ[p]++; } } // mai ramane sa incerc sa fac pe un singur numar // incerc sa fac o singura operatie pe orice numar for (int i = 1; i <= n; ++i) { for (auto& p : factors[a[i]]) { occ[p]--; } for (auto& p : factors[a[i] + 1]) { if (occ[p] > 0) { ckmin(answer, b[i]); } } for (auto& p : factors[a[i]]) { occ[p]++; } } // incerc sa fac operatii pe cel mai ieftin numar for (auto& p : factors[a[ord[0]]]) { occ[p]--; } for (auto& it : occ) { if (it.second > 0) { int p = it.first; ckmin(answer, 1ll * (p - a[ord[0]] % p) % p * b[ord[0]]); } } cout << answer << "\n"; } int main() { ios::sync_with_stdio(0); cin.tie(0); for (int i = 1; i <= valmax; ++i) { spf[i] = i; } for (int i = 2; i * i <= valmax; ++i) { if (spf[i] == i) { for (int j = i * i; j <= valmax; j += i) { ckmin(spf[j], i); } } } for (int i = 1; i <= valmax; ++i) { int x = i; while (x > 1) { if (factors[i].empty() or factors[i].back() != spf[x]) { factors[i].push_back(spf[x]); } x /= spf[x]; } } int tc = 1; cin >> tc; for (int t = 1; t <= tc; ++t) { #ifdef _DEBUG cerr << "=== Subtask " << t << " ===\n"; #endif testcase(); #ifdef _DEBUG cerr << "\n"; #endif } }