#include #include #include #include #include #include #include using namespace std; ifstream inF("alchemy.in"); ofstream outF("alchemy.out"); #define cin inF #define cout outF const int MAX_N = 200001; typedef unsigned long long ull; int n; ull x[MAX_N]; ull a[MAX_N]; ull b[MAX_N]; bool poss; ull minQ, maxQ; void input() { cin >> n; for (int i = 0; i < n; ++i) { cin >> x[i]; } for (int i = 0; i < n; ++i) { cin >> a[i] >> b[i]; } } void output() { if (!poss) cout << -1 << "\n"; else cout << minQ << " " << maxQ << "\n"; } ull gcd(ull a, ull b) { while (b != 0) { ull temp = b; b = a % b; a = temp; } return a; } ull x2[MAX_N]; ull b2[MAX_N]; ull num[MAX_N]; void solve() { ull totalG = x[0]; for (int i = 0; i < n; ++i) { totalG = gcd(x[i], totalG); } for (int i = 0; i < n; ++i) { x[i] /= totalG; ull g = gcd(x[i], b[i]); x2[i] = x[i] / g; b2[i] = b[i] / g; //std::cerr << i << ": " << x2[i] << " " << b2[i] << std::endl; } ull lcm = 1; for (int i = 0; i < n; ++i) { ull g = gcd(lcm, b2[i]); lcm = lcm / g * b2[i]; //std::cerr << " " << i << ": " << lcm << std::endl; if (lcm / b2[i] * x2[i] > a[i]) { poss = false; return; } } minQ = 0; ull maxNum = 2e9; for (int i = 0; i < n; ++i) { num[i] = lcm / b2[i] * x2[i]; //std::cerr << i << ": " << num[i] << " " << a[i] << std::endl; if (num[i] > a[i]) { poss = false; return; } minQ += num[i] * b[i]; maxNum = min(maxNum, a[i] / num[i]); } maxQ = minQ * maxNum; poss = true; } int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; for (int i = 0; i < t; ++i) { input(); solve(); output(); } return 0; }