#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;
}
