#include <bits/stdc++.h>
using namespace std;
long long jc[233];
long long inv[233], invv[1000003 + 10];
long long f[233];
long long qpow(long long x, long long y) {
  long long ans = 1, cnt = x;
  while (y) {
    if (y & 1) ans = (ans * cnt) % 1000003;
    cnt = (cnt * cnt) % 1000003;
    y >>= 1;
  }
  return ans;
}
int main() {
  jc[0] = inv[0] = 1;
  for (int i = 1; i < 11; i++) {
    jc[i] = jc[i - 1] * i % 1000003;
    inv[i] = qpow(jc[i], 1000003 - 2);
  }
  invv[1] = 1;
  for (int i = 2; i <= 1000003; i++) {
    invv[i] = invv[1000003 % i] * (1000003 - 1000003 / i) % 1000003;
  }
  for (int i = 0; i < 11; i++) {
    printf("? %d\n", i);
    fflush(stdout);
    scanf("%I64d", &f[i]);
    if (f[i] == 0) {
      printf("! %d\n", i);
      fflush(stdout);
      return 0;
    }
  }
  long long Sum = 0, flag = -1, Now;
  long long temp = 1;
  for (int i = 11; i < 1000003; i++) {
    Sum = 0, flag = -1;
    temp = 1;
    for (int k = 0; k < 11; k++) temp = temp * (i - k) % 1000003;
    for (int j = 0; j < 11; j++) {
      Now = (flag * f[j] * temp) % 1000003 * inv[10 - j] % 1000003 * inv[j] %
            1000003 * invv[i - j] % 1000003;
      flag = -flag;
      Sum = (Sum + Now) % 1000003;
    }
    if (Sum == 0) {
      printf("! %d\n", i);
      fflush(stdout);
      return 0;
    }
  }
  printf("! -1\n");
  fflush(stdout);
  return 0;
}
