← Home
For problem statement at 1000-1999/1500-1599/1570-1579/1575/problemF.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1570-1579/1575/verifierF.go ends with test 1 failed:
input:
3 6
3 3 3 
expected: 42
got: 0
exit status 1 can you fix the verifier? package main

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

const MOD int64 = 1000000007

type FastScanner struct {
	data []byte
	idx  int
}

func NewFastScanner() *FastScanner {
	b, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: b}
}

func (fs *FastScanner) NextInt() int {
	n := len(fs.data)
	for fs.idx < n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	sign := 1
	if fs.idx < n && fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	val := 0
	for fs.idx < n {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		val = val*10 + int(c-'0')
		fs.idx++
	}
	return sign * val
}

func main() {
	fs := NewFastScanner()
	n := fs.NextInt()
	k := fs.NextInt()

	counts := make(map[int]int)
	c := 0
	for i := 0; i < n; i++ {
		x := fs.NextInt()
		if x == -1 {
			c++
		} else {
			counts[x]++
		}
	}
	K := n - c

	inv := make([]int64, n+1)
	harm := make([]int64, n+1)
	inv[1] = 1
	for i := 2; i <= n; i++ {
		inv[i] = MOD - (MOD/int64(i))*inv[int(MOD%int64(i))]%MOD
	}
	for i := 1; i <= n; i++ {
		harm[i] = harm[i-1] + inv[i]
		if harm[i] >= MOD {
			harm[i] -= MOD
		}
	}

	nmod := int64(n)
	kmod := int64(k) % MOD

	gamma := int64(0)
	pow := kmod
	for m := 2; m <= n; m++ {
		gamma += nmod * pow % MOD * inv[m] % MOD
		gamma %= MOD
		pow = pow * kmod % MOD
	}

	ans := gamma

	if K == 0 {
		sub := (nmod*harm[n]%MOD - nmod + MOD) % MOD
		ans -= sub
	} else {
		sub := nmod * ((harm[n] - harm[K] + MOD) % MOD) % MOD
		ans -= sub

		if K >= 2 {
			weight := make([]int64, K+1)
			weight[2] = nmod * kmod % MOD * inv[K] % MOD * inv[K-1] % MOD
			for t := 2; t < K; t++ {
				weight[t+1] = weight[t] * kmod % MOD * int64(t) % MOD * inv[K-t] % MOD
			}

			higher := int64(0)
			for _, s := range counts {
				comb := int64(1)
				for t := 1; t <= s; t++ {
					comb = comb * int64(s-t+1) % MOD * inv[t] % MOD
					if t >= 2 {
						higher += comb * weight[t] % MOD
						if higher >= MOD {
							higher -= MOD
						}
					}
				}
			}
			ans -= higher
		}
	}

	ans %= MOD
	if ans < 0 {
		ans += MOD
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprint(out, ans)
	out.Flush()
}