#include <bits/stdc++.h>
using namespace std;
namespace flyinthesky {
const long long MO = 1e6 + 3;
long long ksm(long long a, long long b) {
  long long ans = 1, bs = a % MO;
  while (b) {
    if (b & 1) ans = (ans * bs) % MO;
    bs = (bs * bs) % MO;
    b >>= 1;
  }
  return ans;
}
long long n = 10, a[15][15], a0;
void clean() {}
int solve() {
  clean();
  cout << "? " << 0 << endl;
  cin >> a0;
  for (long long i = 1; i <= n; ++i) {
    cout << "? " << i << endl;
    long long tmp;
    cin >> tmp;
    a[i][0] = ((tmp - a0) % MO + MO) % MO;
    for (long long bs = i, j = 1; j <= n; ++j, bs = (bs * i) % MO) a[i][j] = bs;
  }
  for (long long i = 1; i <= n; ++i) {
    if (a[i][i] == 0)
      for (long long j = i; j <= n; ++j)
        if (a[j][i] != 0) swap(a[i], a[j]);
    for (long long j = 1; j <= n; ++j) {
      if (i == j) continue;
      long long rat = a[j][i] * ksm(a[i][i], MO - 2) % MO;
      for (long long k = 1; k <= n; ++k)
        a[j][k] = ((a[j][k] - rat * a[i][k] % MO) % MO + MO) % MO;
      a[j][0] = ((a[j][0] - rat * a[i][0]) % MO + MO) % MO;
    }
  }
  for (long long i = 1; i <= n; ++i)
    a[i][0] = a[i][0] * ksm(a[i][i], MO - 2) % MO;
  for (long long i = 0; i < MO; ++i) {
    long long ret = a0;
    for (long long j = 1; j <= n; ++j)
      ret = (ret + a[j][0] * ksm(i, j) % MO) % MO;
    if (ret == 0) {
      return cout << "! " << i << endl, 0;
    }
  }
  cout << "! " << -1 << endl;
  return 0;
}
}  // namespace flyinthesky
int main() {
  flyinthesky::solve();
  return 0;
}
