← Home
For problem statement at 0-999/900-999/990-999/993/problemE.txt this is a correct solution, but verifier at 0-999/900-999/990-999/993/verifierE.go ends with All tests passed! can you fix the verifier? package main

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

var N int
var roots []complex128

func fft(a []complex128, invert bool) {
	n := len(a)
	for i, j := 1, 0; i < n; i++ {
		bit := n >> 1
		for j&bit != 0 {
			j ^= bit
			bit >>= 1
		}
		j ^= bit
		if i < j {
			a[i], a[j] = a[j], a[i]
		}
	}

	for length := 2; length <= n; length <<= 1 {
		half := length / 2
		step := N / length
		for i := 0; i < n; i += length {
			for j := 0; j < half; j++ {
				u := a[i+j]
				w := roots[j*step]
				if invert {
					w = complex(real(w), -imag(w))
				}
				v := a[i+j+half] * w
				a[i+j] = u + v
				a[i+j+half] = u - v
			}
		}
	}
	if invert {
		inv := complex(1/float64(n), 0)
		for i := 0; i < n; i++ {
			a[i] *= inv
		}
	}
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)

	readInt := func() int {
		scanner.Scan()
		res := 0
		sign := 1
		for i, b := range scanner.Bytes() {
			if i == 0 && b == '-' {
				sign = -1
			} else {
				res = res*10 + int(b-'0')
			}
		}
		return res * sign
	}

	if !scanner.Scan() {
		return
	}
	n := 0
	sign := 1
	for i, b := range scanner.Bytes() {
		if i == 0 && b == '-' {
			sign = -1
		} else {
			n = n*10 + int(b-'0')
		}
	}
	n *= sign

	x := readInt()
	a := make([]int, n)
	for i := 0; i < n; i++ {
		a[i] = readInt()
	}

	N = 1
	for N <= 2*n {
		N *= 2
	}

	roots = make([]complex128, N/2)
	for i := 0; i < N/2; i++ {
		ang := 2 * math.Pi * float64(i) / float64(N)
		roots[i] = complex(math.Cos(ang), math.Sin(ang))
	}

	A := make([]complex128, N)
	B := make([]complex128, N)

	cnt := make([]int, n+1)
	sum := 0
	cnt[0] = 1
	for i := 0; i < n; i++ {
		if a[i] < x {
			sum++
		}
		cnt[sum]++
	}

	for i := 0; i <= n; i++ {
		A[i] = complex(float64(cnt[i]), 0)
		B[n-i] = complex(float64(cnt[i]), 0)
	}

	fft(A, false)
	fft(B, false)
	for i := 0; i < N; i++ {
		A[i] *= B[i]
	}
	fft(A, true)

	ans := make([]int64, n+1)
	ans0 := int64(0)
	curr := int64(0)
	for _, v := range a {
		if v >= x {
			curr++
		} else {
			ans0 += curr * (curr + 1) / 2
			curr = 0
		}
	}
	ans0 += curr * (curr + 1) / 2
	ans[0] = ans0

	for k := 1; k <= n; k++ {
		ans[k] = int64(math.Round(real(A[n+k])))
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()
	for i := 0; i <= n; i++ {
		fmt.Fprintf(out, "%d", ans[i])
		if i != n {
			fmt.Fprint(out, " ")
		}
	}
	fmt.Fprintln(out)
}