package main import . "fmt" func main() { var n int Scan(&n) s := newS(n) x := "" for i := 0; i <= n; i++ { var a,b int a, b, x = s.req() if x != "" || i == n { break } Println("?", min(a, b), max(a, b)) var p int Scan(&p) s.res(p) } Println("!",x) } type S struct { n int pos int ms []int ps []int } func newS(n int) *S { s := &S{ n: n, pos: n-2, ps: make([]int, n), ms: make([]int, 10), } return s } func (s *S)req() (a, b int, x string) { if s.pos < 0 { mx := 0 for i := 1; i <= 9; i++ { mx = max(mx, s.ms[i]) } h := 0 cnt := 0 for i := 1; i <= 9; i++ { if mx == s.ms[i] { h = i cnt++ } } if cnt != 1 { if s.pos == -1 { for i, u := range s.ps[:s.n-1] { if u == 0 { continue } for j, v := range s.ps[i+1:s.n-1] { if v == 0 { continue } a, b = i, j+i+1 return } } } x = "-1" return } bs := make([]byte, s.n) bs[0] = byte(h+'0') for k, p := range s.ps[:s.n-1] { for i := 0; i <= 9; i++ { if i*h == p { bs[s.n-1-k] = byte(i + '0') break } } } x = string(bs) return } b = s.n-1 a = s.pos return } func (s *S)res(p int) { if s.pos == -1 { s.pos-- for i, u := range s.ps[:s.n-1] { if u == 0 { continue } for _, v := range s.ps[i+1:s.n-1] { if v == 0 { continue } // u = e * f // v = e * g // p = f * g for e := 1; e <= 9; e++ { if u*v == e*e*p { s.ms[e] += 9999 return } } return } } return } s.ps[s.pos] = p for i := 1; i <= 9; i++ { for j := 0; j <= 9; j++ { if i*j == p { s.ms[i]++ } } } s.pos-- } func init() { check() } func check() { for x := 1202; x < 10000; x++ { n := 4 xs := []byte(Sprint(x)) s := newS(n) ok := false for i := 0; i <= n; i++ { a,b,rx := s.req() if rx != "" || i == n { var rxx int Sscan(rx, &rxx) if x != rxx { println("n=",n) println("x=",x) println("rx=",rx) println("OMG!") return } ok = true break } u := int(xs[n-1-a])-'0' v := int(xs[n-1-b])-'0' p := u*v s.res(p) } if !ok { println("n=",n) println("x=",x) println("OOPS!") return } } println("ok") }