← Home
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()
}