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)
}