← Home
For problem statement at 1000-1999/1000-1099/1080-1089/1081/problemF.txt this is a correct solution, but verifier at 1000-1999/1000-1099/1080-1089/1081/verifierF.go ends with Problem F is interactive and cannot be automatically verified. can you fix the verifier? package main

import (
	"fmt"
	"math/rand"
	"time"
)

func modInverse(a, m int) int {
	return power(a, m-2, m)
}

func power(base, exp, mod int) int {
	res := 1
	base %= mod
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % mod
		}
		base = (base * base) % mod
		exp /= 2
	}
	return res
}

func main() {
	rand.Seed(time.Now().UnixNano())

	var n, t int
	if _, err := fmt.Scan(&n, &t); err != nil {
		return
	}

	P := 1000000007
	basis := make([][]int, n+1)
	rank := 0

	insert := func(row []int) bool {
		for i := 1; i <= n; i++ {
			if row[i] == 0 {
				continue
			}
			if basis[i] == nil {
				inv := modInverse(row[i], P)
				for j := i; j <= n+1; j++ {
					row[j] = (row[j] * inv) % P
				}
				basis[i] = append([]int(nil), row...)
				rank++
				return true
			} else {
				coef := row[i]
				for j := i; j <= n+1; j++ {
					row[j] = (row[j] - coef*basis[i][j]) % P
					if row[j] < 0 {
						row[j] += P
					}
				}
			}
		}
		return false
	}

	initRow := make([]int, n+2)
	for i := 1; i <= n; i++ {
		initRow[i] = 1
	}
	initRow[n+1] = t % P
	insert(initRow)

	f := make([]int, n+1)
	c := t

	queries := 0
	for rank < n && queries < 10000 {
		var l, r int
		for {
			l = rand.Intn(n) + 1
			r = l + rand.Intn(n-l+1)
			if (l+r)%2 == n%2 {
				break
			}
		}

		fmt.Printf("? %d %d\n", l, r)
		queries++

		var c_prime int
		fmt.Scan(&c_prime)
		if c_prime == -1 {
			return
		}

		diff_parity := ((c_prime - c) % 2 + 2) % 2
		L1 := r
		L2 := n - l + 1

		var L int
		var S []int
		if L1%2 == diff_parity {
			L = L1
			for j := 1; j <= r; j++ {
				S = append(S, j)
			}
		} else {
			L = L2
			for j := l; j <= n; j++ {
				S = append(S, j)
			}
		}

		k := (c + L - c_prime) / 2

		sum_f := 0
		for _, j := range S {
			sum_f += f[j]
		}

		row := make([]int, n+2)
		for _, j := range S {
			aj := (1 - 2*f[j]) % P
			if aj < 0 {
				aj += P
			}
			row[j] = aj
		}
		b := (k - sum_f) % P
		if b < 0 {
			b += P
		}
		row[n+1] = b

		insert(row)

		for _, j := range S {
			f[j] = 1 - f[j]
		}
		c = c_prime
	}

	ans := make([]int, n+1)
	for i := n; i >= 1; i-- {
		if basis[i] == nil {
			continue
		}
		ans[i] = basis[i][n+1]
		for j := i + 1; j <= n; j++ {
			ans[i] = (ans[i] - basis[i][j]*ans[j]) % P
			if ans[i] < 0 {
				ans[i] += P
			}
		}
	}

	fmt.Print("! ")
	for i := 1; i <= n; i++ {
		fmt.Print(ans[i])
	}
	fmt.Println()
}