#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector<int> sieve_primes(int limit) {
vector<char> is_prime(limit + 1, true);
vector<int> primes;
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= limit; ++i) {
if (is_prime[i]) {
primes.push_back(i);
if ((ll)i * i <= limit) {
for (int j = i * i; j <= limit; j += i) is_prime[j] = false;
}
}
}
return primes;
}
vector<ll> factor_unique(ll x, const vector<int>& primes) {
vector<ll> res;
for (int p : primes) {
if ((ll)p * p > x) break;
if (x % p == 0) {
res.push_back(p);
while (x % p == 0) x /= p;
}
}
if (x > 1) res.push_back(x);
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (!(cin >> T)) return 0;
int sieve_limit = 200000;
auto primes = sieve_primes(sieve_limit);
while (T--) {
int n;
cin >> n;
vector<ll> a(n);
vector<ll> b(n);
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> b[i];
unordered_map<ll, vector<int>> orig_idx;
unordered_map<ll, vector<int>> plus_idx;
for (int i = 0; i < n; ++i) {
auto facs = factor_unique(a[i], primes);
for (ll p : facs) orig_idx[p].push_back(i);
auto facs_plus = factor_unique(a[i] + 1, primes);
for (ll p : facs_plus) plus_idx[p].push_back(i);
}
bool zero = false;
for (auto &kv : orig_idx) {
if (kv.second.size() >= 2) { zero = true; break; }
}
if (zero) {
cout << 0 << '\n';
continue;
}
bool one = false;
for (auto &kv : plus_idx) {
ll p = kv.first;
const auto &plusvec = kv.second;
if (!orig_idx.count(p)) continue;
const auto &origvec = orig_idx[p];
if (origvec.empty()) continue;
int idx0 = origvec[0];
for (int j : plusvec) {
if (j != idx0) { one = true; break; }
}
if (one) break;
}
if (one) {
cout << 1 << '\n';
continue;
}
cout << 2 << '\n';
}
return 0;
}