/* Problem URL: https://codeforces.com/contest/2210/problem/C2 */ #include #include #include using namespace std; using namespace __gnu_pbds; template > using ordered_set = tree; #define V vector #define rmin(a, b) a = min(a, b) #define rmax(a, b) a = max(a, b) #define rep(i, lim) for (int i = 0; i < (lim); i++) #define nrep(i, s, lim) for (int i = s; i < (lim); i++) #define repv(i, v) for (auto &i : (v)) #define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } #define sortv(v) sort(v.begin(), v.end()) #define all(v) (v).begin(), (v).end() using vi = vector; using vvi = vector; using vvvi = vector; using vvvvi = vector; using ll = long long; using vl = vector; using vvl = vector; using vvvl = vector; using vvvvl = vector; template auto operator<<(ostream &os, const vector &vec)->ostream& { os << vec[0]; for (size_t i = 1; i < vec.size(); i++) { os << ' ' << vec[i]; } os << '\n'; return os; } template auto operator>>(istream &is, vector &vec)->istream& { for (auto &i : vec) { is >> i; } return is; } template auto operator<<(ostream &os, const vector> &vec)->ostream& { for (auto &i : vec) { os << i[0]; for (size_t j = 1; j < i.size(); j++) { os << ' ' << i[j]; } os << '\n'; } return os; } template auto operator>>(istream &is, vector> &vec)->istream& { for (auto &i : vec) { for (auto &j : i) { is >> j; } } return is; } const int oo = INT32_MAX >> 1; const ll OO = INT64_MAX >> 1; constexpr int MAXN = 5e4 + 10; int di[MAXN]; vi divs[MAXN]; vi primes; void pre() { // fill(di, di + MAXN, 1); // iota(di, di + MAXN, 0); // primes.push_back(1); // nrep(i, 2, MAXN) { // if (di[i] != i) { // continue; // } // primes.push_back(i); // // for (int j = i; j < MAXN; j += i) { // di[j] = i; // } // } // nrep(i, 2, MAXN) { // int cur = i; // while (cur > 1) { // int now = di[i]; // divs[i].push_back(now); // while (di[i] == now) { // i /= now; // } // } // } } #define TEST 1 void solve() { int n; cin >> n; vl a(n); vl b(n); cin >> a >> b; // vl act(n); // act[0] = gcd(a[0], a[1]); // act[n - 1] = gcd(a[n - 1], a[n - 2]); // // nrep(i, 1, n - 1) { // ll g1 = gcd(a[i], a[i + 1]); // ll g2 = gcd(a[i], a[i - 1]); // // act[i] = lcm(g1, g2); // } // priority_queue> pq; rep(i, n) { pq.emplace(b[i], i); } int act = 0; // ll t = gcd(a[0], a[1]); // if (t != a[0] && t <= b[0]) { // a[0] = t; // act++; // } // t = gcd(a[n - 1], a[n - 2]); // if (t != a[n - 1] && t <= b[n - 1]) { // a[n - 1] = t; // act++; // } while (!pq.empty()) { auto [bi, i] = pq.top(); pq.pop(); ll g1 = i == n - 1 ? 1 : gcd(a[i], a[i + 1]); ll g2 = i == 0 ? 1 : gcd(a[i], a[i - 1]); ll bs = lcm(g1, g2); int low = 1; int high = 1e9; int ans = 0; while (low <= high) { int mid = (low + high) >> 1; if (bs * mid <= b[i]) { ans = mid; low = mid + 1; continue; } high = mid - 1; } if (ans == 0) { continue; } ll t1 = i == n - 1 ? 1 : a[i + 1] / g1; ll t2 = i == 0 ? 1 : a[i - 1] / g2; // ll lc = lcm(t1, t2); // while (ans > 0 && (t1 % primes[ans] == 0 || t2 % primes[ans] == 0 || primes[ans] * bs == a[i])) { // ans--; // } if (ans % t1 == 0) { ans /= t1; } if (ans % t2 == 0) { ans /= t2; } act += bs * ans != a[i]; a[i] = bs * ans; } cout << act << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); pre(); int t; (TEST && cin >> t) || (t = 1); while (t--) { solve(); } }