← Home
For problem statement at 0-999/800-899/850-859/850/problemE.txt this is a correct solution, but verifier at 0-999/800-899/850-859/850/verifierE.go ends with Test 1 failed
Input:
4
0100111000000010
Expected:
888
Got:
1248


exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	in := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(in, &n)
	var s string
	fmt.Fscan(in, &s)

	size := 1 << n
	f := make([]int64, size)
	for i := 0; i < size; i++ {
		if s[i] == '1' {
			f[i] = 1
		}
	}

	for step := 1; step < size; step *= 2 {
		for i := 0; i < size; i += 2 * step {
			for j := i; j < i+step; j++ {
				u := f[j]
				v := f[j+step]
				f[j] = u + v
				f[j+step] = u - v
			}
		}
	}

	p3 := make([]int64, n+1)
	p3[0] = 1
	for i := 1; i <= n; i++ {
		p3[i] = p3[i-1] * 3
	}

	var Y int64 = 0
	for z := 0; z < size; z++ {
		if f[z] == 0 {
			continue
		}
		zPop := 0
		for i := 0; i < n; i++ {
			if (z >> i & 1) == 1 {
				zPop++
			}
		}
		var sumZ int64 = 0
		for w := 0; w < size; w++ {
			if f[w] == 0 || f[z^w] == 0 {
				continue
			}
			wMinusZPop := 0
			for i := 0; i < n; i++ {
				if (w>>i&1) == 1 && (z>>i&1) == 0 {
					wMinusZPop++
				}
			}
			
			term := f[w] * f[z^w] * p3[n-zPop-wMinusZPop]
			if (zPop+wMinusZPop)%2 != 0 {
				term = -term
			}
			sumZ += term
		}
		Y += f[z] * sumZ
	}

	Y /= (1 << (2 * n))

	mod := int64(1000000007)
	p6 := int64(1)
	for i := 0; i < n; i++ {
		p6 = (p6 * 6) % mod
	}

	Y %= mod
	ans := (p6 - 2*Y) % mod
	if ans < 0 {
		ans += mod
	}
	fmt.Println(ans)
}