#include <bits/stdc++.h>
int query(long long q) {
  printf("? %lld\n", q);
  fflush(stdout);
  int gcd;
  scanf("%d", &gcd);
  return gcd;
}
void printAnswer(int answer) {
  printf("! %d\n", answer);
  fflush(stdout);
}
const int MAX_PRIMES = 617;
const int MAX_X = 1000 * 1000 * 1000;
const long long MAX_QUERY = 1000LL * 1000LL * 1000LL * 1000LL * 1000LL * 1000LL;
bool isPrime[1 + MAX_PRIMES];
int main() {
  for (int i = 2; i <= MAX_PRIMES; i++) {
    isPrime[i] = true;
  }
  std::vector<long long> queries;
  queries.push_back(1);
  for (int p = 2; p <= MAX_PRIMES; p++) {
    if (isPrime[p]) {
      for (int m = p * p; m <= MAX_PRIMES; m += p) {
        isPrime[m] = false;
      }
      if (queries.back() <= MAX_QUERY / p) {
        long long b = queries.back();
        queries.pop_back();
        queries.push_back(b * p);
      } else {
        queries.push_back(p);
      }
    }
  }
  int t;
  scanf("%d", &t);
  for (int _ = 0; _ < t; _++) {
    std::vector<int> primeDivs;
    for (long long q : queries) {
      int gcd = query(q);
      for (int p = 2; p <= MAX_PRIMES; p++) {
        if (gcd % p == 0) {
          primeDivs.push_back(p);
          while (gcd % p == 0) {
            gcd /= p;
          }
        }
      }
    }
    for (int &p : primeDivs) {
      int copy = p;
      while (p <= MAX_X / copy) {
        p *= copy;
      }
    }
    if (primeDivs.size() % 2 == 1) {
      primeDivs.push_back(1);
    }
    int sureAnswer = 1;
    for (int i = 0; i < (int)primeDivs.size(); i += 2) {
      long long q = (long long)primeDivs[i] * primeDivs[i + 1];
      int gcd = query(q);
      for (int p = 2; p <= MAX_PRIMES; p++) {
        int exp = 0;
        while (gcd % p == 0) {
          gcd /= p;
          exp++;
        }
        sureAnswer *= exp + 1;
      }
    }
    int guessAnswer = std::max(sureAnswer + 7, sureAnswer * 2);
    printAnswer(guessAnswer);
    primeDivs.clear();
  }
  return 0;
}
