#include <bits/stdc++.h>   using namespace std;   bool is_prime(int n) {     if (n <= 1) return false;     for (int i = 2; i * i <= n; i++) {       if (n % i == 0) {         return false;       }     }     return true;   }   vector<int> gen_primes(int l, int r) {     vector<int> primes;     for (int i = l; i <= r; i++) {       if (is_prime(i)) {         primes.push_back(i);       }     }     return primes;   }   vector<long long> gen_batch(const vector<int>& primes) {     constexpr long long limit = (long long)1e18;     vector<long long> batch;     long long cur = 1;     for (int i = 0; i < primes.size(); i++) {       if (cur <= limit / primes[i]) {         cur *= primes[i];       } else {         batch.push_back(cur);         cur = primes[i];       }     }     if (cur > 1) {       batch.push_back(cur);     }     return batch;   }   vector<long long> get_gcds(const vector<long long>& batch) {     vector<long long> gcds;     for (long long x : batch) {       cout <<  ?   << x << endl;       long long g;       cin >> g;       gcds.push_back(g);     }     return gcds;   }   vector<int> get_candidates(const vector<int>& primes,                              const vector<long long>& gcds) {     vector<int> candidates;     for (long long g : gcds) {       for (int p : primes) {         if (g % p == 0) {           candidates.push_back(p);         }       }     }     return candidates;   }   long long build_one(int c) {     constexpr long long limit = (long long)1e9;     long long cur = 1;     while (cur <= limit / c) cur *= c;     return cur;   }   long long build_two(int c1, int c2) {     long long res1 = build_one(c1);     long long res2 = build_one(c2);     return res1 * res2;   }   void solve() {     auto primes = gen_primes(1, 177);     auto batch = gen_batch(primes);     auto gcds = get_gcds(batch);     auto candidates = get_candidates(primes, gcds);     if (candidates.size() == 0) {       cout <<  ! 1  << endl;       return;     }     vector<pair<int, long long>> divs;     if (candidates.size() == 1) {       long long output = build_one(candidates[0]);       cout <<  ?   << output << endl;       long long g;       cin >> g;       if (candidates[0] == g) {         cout <<  ! 8  << endl;         return;       }       divs.push_back(make_pair(candidates[0], g));     } else {       for (int i = 0; i + 1 < candidates.size(); i += 2) {         long long output = build_two(candidates[i], candidates[i + 1]);         cout <<  ?   << output << endl;         long long g;         cin >> g;         divs.push_back(make_pair(candidates[i], g));         divs.push_back(make_pair(candidates[i + 1], g));       }       if (candidates.size() % 2 == 1) {         long long output = build_one(candidates.back());         cout <<  ?   << output << endl;         long long g;         cin >> g;         divs.push_back(make_pair(candidates.back(), g));       }     }     long long lim = (long long)1e9, res = 1;     for (const pair<int, long long>& d : divs) {       int a = d.first;       long long b = d.second;       long long c = 1;       int tmp = 0;       while (b % a == 0) {         ++tmp;         b /= a;         c *= a;       }       res *= (tmp + 1);       lim /= c;     }     int upto = (int)pow((double)lim, 1.0 / 3);     primes = gen_primes(178, upto);     batch = gen_batch(primes);     gcds = get_gcds(batch);     for (long long g : gcds) {       if (g != 1) {         res *= 2;         break;       }     }     cout <<  !   << 2 * res << endl;   }   int main() {     int tst;     cin >> tst;     while (tst--) solve();     return 0;   }