Problem: This is an interactive problem.

We have hidden an integer 1 ≤ X ≤ 10^{9}. You don't have to guess this number. You have to find the number of divisors of this number, and you don't even have to find the exact number: your answer will be considered correct if its absolute error is not greater than 7 or its relative error is not greater than 0.5. More formally, let your answer be ans and the number of divisors of X be d, then your answer will be considered correct if at least one of the two following conditions is true:

  * | ans - d | ≤ 7;
  * 1/2 ≤ ans/d ≤ 2.



You can make at most 22 queries. One query consists of one integer 1 ≤ Q ≤ 10^{18}. In response, you will get gcd(X, Q) — the greatest common divisor of X and Q.

The number X is fixed before all queries. In other words, interactor is not adaptive.

Let's call the process of guessing the number of divisors of number X a game. In one test you will have to play T independent games, that is, guess the number of divisors T times for T independent values of X.

Input

The first line of input contains one integer T (1 ≤ T ≤ 100) — the number of games.

Interaction

To make a query print a line "? Q" (1 ≤ Q ≤ 10^{18}). After that read one integer gcd(X, Q). You can make no more than 22 such queries during one game.

If you are confident that you have figured out the number of divisors of X with enough precision, you can print your answer in "! ans" format. ans have to be an integer. If this was the last game, you have to terminate the program, otherwise you have to start the next game immediately. Note that the interactor doesn't print anything in response to you printing answer.

After printing a query do not forget to output end of line and flush the output. To do this, use:

  * fflush(stdout) or cout.flush() in C++;
  * System.out.flush() in Java;
  * flush(output) in Pascal;
  * stdout.flush() in Python;
  * see documentation for other languages.



Hacks

To hack, use the following format:

The first line contains one integer T (1 ≤ T ≤ 100) — the number of games.

Each of the next T lines contains one integer X (1 ≤ X ≤ 10^{9}) — the hidden number.

So the example has the form 
    
    
      
    2  
    998244353  
    4194304  
    

Example

Input


2

1

1

1


1024

1048576

4194304


Output



? 982306799268821872

? 230856864650023977

? 134690134760714371

! 5
? 1024

? 1048576

? 1073741824

! 42

Note

Why the limitation for number of queries is 22 exactly? Maybe the problem author is a Taylor Swift fan.

Let's look at the example.

In the first game X = 998 244 353 is hidden. Would be hard to guess this, right? This number is prime, so the number of its divisors is 2. The solution has made several random queries, and all the responses turned out to be 1 (strange things, not even one of three random numbers is divisible by 998 244 353). It's fare to assume that the hidden number doesn't have many divisors, so the solution has answered 5. Why not. This answer will be considered correct since | 5 - 2 | = 3 ≤ 7.

In the second game X = 4 194 304 = 2^{22} is hidden, it has 23 divisors. The solution has made queries 1024 = 2^{10}, 1 048 576 =2^{20}, 1 073 741 824 = 2^{30} and got responses 1024 = 2^{10}, 1 048 576 =2^{20}, 4 194 304 = 2^{22}, respectively. Then the solution got completely confused and answered the answer to The Ultimate Question of Life, the Universe, and Everything. This answer will be considered correct since 1/2 ≤ 42/23 ≤ 2.

Solution (in JAVA):

Solution:
import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.io.IOException;
import java.util.Stack;
import java.io.UncheckedIOException;
import java.util.Vector;
import java.io.Closeable;
import java.io.Writer;
import java.io.OutputStreamWriter;
import java.io.InputStream;
 
/**
 * @author khokharnikunj8
 */
public class Main {
    public static void main(String[] args) throws Exception {
        new TaskAdapter().run();
    }
 
    static class TaskAdapter implements Runnable {
        @Override
        public void run() {
            InputStream inputStream = System.in;
            OutputStream outputStream = System.out;
            FastInput in = new FastInput(inputStream);
            FastOutput out = new FastOutput(outputStream);
            FGuessDivisorsCount solver = new FGuessDivisorsCount();
            solver.solve(1, in, out);
            out.close();
        }
    }
 
    static class FGuessDivisorsCount {
        int[] primes = sieveEratosthenes(10000);
 
        public int[] sieveEratosthenes(int n) {
            if (n <= 32) {
                int[] primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
                for (int i = 0; i < primes.length; i++) {
                    if (n < primes[i]) {
                        return Arrays.copyOf(primes, i);
                    }
                }
                return primes;
            }
 
            int u = n + 32;
            double lu = Math.log(u);
            int[] ret = new int[(int) (u / lu + u / lu / lu * 1.5)];
            ret[0] = 2;
            int pos = 1;
 
            int[] isp = new int[(n + 1) / 32 / 2 + 1];
            int sup = (n + 1) / 32 / 2 + 1;
 
            int[] tprimes = {3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
            for (int tp : tprimes) {
                ret[pos++] = tp;
                int[] ptn = new int[tp];
                for (int i = (tp - 3) / 2; i < tp << 5; i += tp)
                    ptn[i >> 5] |= 1 << (i & 31);
                for (int i = 0; i < tp; i++) {
                    for (int j = i; j < sup; j += tp)
                        isp[j] |= ptn[i];
                }
            }
 
            // 3,5,7
            // 2x+3=n
            int[] magic = {0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4,
                    13, 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14};
            int h = n / 2;
            for (int i = 0; i < sup; i++) {
                for (int j = ~isp[i]; j != 0; j &= j - 1) {
                    int pp = i << 5 | magic[(j & -j) * 0x076be629 >>> 27];
                    int p = 2 * pp + 3;
                    if (p > n)
                        break;
                    ret[pos++] = p;
                    for (int q = pp; q <= h; q += p)
                        isp[q >> 5] |= 1 << (q & 31);
                }
            }
 
            return Arrays.copyOf(ret, pos);
        }
 
        public void solve(int testNumber, FastInput in, FastOutput out) {
            int t = in.readInt();
            while (t-- > 0) {
                int pointer = 0;
                long lcm = 1;
                int total = 22;
                while (total > 0) {
                    int init = pointer;
                    long temp = 1;
                    while ((double) temp * primes[pointer] < 1e18) temp *= primes[pointer++];
                    total--;
                    out.println("? " + temp);
                    out.flush();
                    long yes = in.readInt();
                    Stack<Integer> rem = new Stack<>();
                    for (int j = init; j < pointer; j++) {
                        if (yes % primes[j] == 0) {
                            rem.add(primes[j]);
                        }
                    }
                    lcm = lcm(lcm, yes);
 
                    while (total > 0 && rem.size() > 0) {
                        total--;
                        int first = rem.pop();
                        int second = 1;
                        if (rem.size() > 0) second = rem.pop();
                        long temp1 = 1;
                        while (temp1 * first < 1000000000) temp1 *= first;
                        long temp2 = 1;
                        while (second != 1 && temp2 * second < 1000000000) temp2 *= second;
                        out.println("? " + temp1 * temp2);
                        out.flush();
                        lcm = lcm(lcm, in.readInt());
                    }
                }
                out.println("! " + countDivisors(lcm) * 2);
                out.flush();
            }
 
        }
 
        int countDivisors(long n) {
            int cnt = 0;
            for (long i = 1; i <= Math.sqrt(n); i++) {
                if (n % i == 0) {
                    if (n / i == i)
                        cnt++;
 
                    else // Otherwise count both
                        cnt = cnt + 2;
                }
            }
            return cnt;
        }
 
        public long lcm(long a, long b) {
            return a / gcd(a, b) * b;
        }
 
        public long gcd(long a, long b) {
            while (b != 0) {
                long t = b;
                b = (a % b);
                a = t;
            }
            return a;
        }
 
    }
 
    static class FastOutput implements AutoCloseable, Closeable, Appendable {
        private final Writer os;
        private final StringBuilder cache = new StringBuilder(1 << 20);
 
        public FastOutput(Writer os) {
            this.os = os;
        }
 
        public FastOutput(OutputStream os) {
            this(new OutputStreamWriter(os));
        }
 
        public FastOutput append(CharSequence csq) {
            cache.append(csq);
            return this;
        }
 
        public FastOutput append(CharSequence csq, int start, int end) {
            cache.append(csq, start, end);
            return this;
        }
 
        public FastOutput append(char c) {
            cache.append(c);
            return this;
        }
 
        public FastOutput append(String c) {
            cache.append(c);
            return this;
        }
 
        public FastOutput println(String c) {
            return append(c).println();
        }
 
        public FastOutput println() {
            cache.append(System.lineSeparator());
            return this;
        }
 
        public FastOutput flush() {
            try {
                os.append(cache);
                os.flush();
                cache.setLength(0);
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
            return this;
        }
 
        public void close() {
            flush();
            try {
                os.close();
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }
 
        public String toString() {
            return cache.toString();
        }
 
    }
 
    static class FastInput {
        private final InputStream is;
        private final byte[] buf = new byte[1 << 13];
        private int bufLen;
        private int bufOffset;
        private int next;
 
        public FastInput(InputStream is) {
            this.is = is;
        }
 
        private int read() {
            while (bufLen == bufOffset) {
                bufOffset = 0;
                try {
                    bufLen = is.read(buf);
                } catch (IOException e) {
                    bufLen = -1;
                }
                if (bufLen == -1) {
                    return -1;
                }
            }
            return buf[bufOffset++];
        }
 
        public void skipBlank() {
            while (next >= 0 && next <= 32) {
                next = read();
            }
        }
 
        public int readInt() {
            int sign = 1;
 
            skipBlank();
            if (next == '+' || next == '-') {
                sign = next == '+' ? 1 : -1;
                next = read();
            }
 
            int val = 0;
            if (sign == 1) {
                while (next >= '0' && next <= '9') {
                    val = val * 10 + next - '0';
                    next = read();
                }
            } else {
                while (next >= '0' && next <= '9') {
                    val = val * 10 - next + '0';
                    next = read();
                }
            }
 
            return val;
        }
 
    }
}