package main
import (
"fmt"
"os"
)
func power(base, exp int64) int64 {
res := int64(1)
base %= 1000003
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % 1000003
}
base = (base * base) % 1000003
exp /= 2
}
return res
}
func modInverse(n int64) int64 {
return power(n, 1000003-2)
}
func main() {
var p int64 = 1000003
matrix := make([][]int64, 11)
for i := 0; i <= 10; i++ {
matrix[i] = make([]int64, 12)
fmt.Printf("? %d\n", i)
os.Stdout.Sync()
var y int64
fmt.Scan(&y)
matrix[i][11] = y
val := int64(1)
for j := 0; j <= 10; j++ {
matrix[i][j] = val
val = (val * int64(i)) % p
}
}
for i := 0; i <= 10; i++ {
pivot := i
for j := i; j <= 10; j++ {
if matrix[j][i] != 0 {
pivot = j
break
}
}
matrix[i], matrix[pivot] = matrix[pivot], matrix[i]
inv := modInverse(matrix[i][i])
for j := i; j <= 11; j++ {
matrix[i][j] = (matrix[i][j] * inv) % p
}
for j := 0; j <= 10; j++ {
if i != j {
factor := matrix[j][i]
for k := i; k <= 11; k++ {
matrix[j][k] = (matrix[j][k] - factor*matrix[i][k]) % p
if matrix[j][k] < 0 {
matrix[j][k] += p
}
}
}
}
}
a := make([]int64, 11)
for i := 0; i <= 10; i++ {
a[i] = matrix[i][11]
}
for x := int64(0); x < p; x++ {
val := int64(0)
for j := 10; j >= 0; j-- {
val = (val*x + a[j]) % p
}
if val == 0 {
fmt.Printf("! %d\n", x)
os.Stdout.Sync()
return
}
}
fmt.Printf("! -1\n")
os.Stdout.Sync()
}