← Home
For problem statement at 1000-1999/1400-1499/1420-1429/1425/problemD.txt this is a correct solution, but verifier at 1000-1999/1400-1499/1420-1429/1425/verifierD.go ends with All tests passed! can you fix the verifier? package main

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

const MOD int64 = 1000000007
const S = 1002
const C = 1000

func nextInt(data []byte, idx *int) int {
	n := len(data)
	i := *idx
	for i < n && (data[i] < '0' || data[i] > '9') {
		i++
	}
	v := 0
	for i < n && data[i] >= '0' && data[i] <= '9' {
		v = v*10 + int(data[i]-'0')
		i++
	}
	*idx = i
	return v
}

func modPow(a, e int64) int64 {
	r := int64(1)
	for e > 0 {
		if e&1 == 1 {
			r = r * a % MOD
		}
		a = a * a % MOD
		e >>= 1
	}
	return r
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	N := nextInt(data, &idx)
	M := nextInt(data, &idx)
	R := nextInt(data, &idx)

	x := make([]int, N)
	y := make([]int, N)
	b := make([]int64, N)
	pref := make([]int, S*S)

	for i := 0; i < N; i++ {
		xi := nextInt(data, &idx)
		yi := nextInt(data, &idx)
		bi := nextInt(data, &idx)
		x[i] = xi
		y[i] = yi
		b[i] = int64(bi) % MOD
		pref[xi*S+yi] = 1
	}

	for i := 1; i <= C; i++ {
		base := i * S
		prev := (i - 1) * S
		for j := 1; j <= C; j++ {
			pref[base+j] += pref[prev+j] + pref[base+j-1] - pref[prev+j-1]
		}
	}

	fact := make([]int64, N+1)
	invFact := make([]int64, N+1)
	comb := make([]int64, N+1)

	fact[0] = 1
	for i := 1; i <= N; i++ {
		fact[i] = fact[i-1] * int64(i) % MOD
	}
	invFact[N] = modPow(fact[N], MOD-2)
	for i := N; i >= 1; i-- {
		invFact[i-1] = invFact[i] * int64(i) % MOD
	}

	invFactM := invFact[M]
	for i := M; i <= N; i++ {
		comb[i] = fact[i] * invFactM % MOD * invFact[i-M] % MOD
	}

	lx := make([]int, N)
	rx := make([]int, N)
	ly := make([]int, N)
	ry := make([]int, N)
	k := make([]int, N)
	miss := make([]int64, N)

	for i := 0; i < N; i++ {
		lxi := x[i] - R
		if lxi < 1 {
			lxi = 1
		}
		rxi := x[i] + R
		if rxi > C {
			rxi = C
		}
		lyi := y[i] - R
		if lyi < 1 {
			lyi = 1
		}
		ryi := y[i] + R
		if ryi > C {
			ryi = C
		}

		lx[i], rx[i], ly[i], ry[i] = lxi, rxi, lyi, ryi

		br := rxi * S
		bl := (lxi - 1) * S
		ki := pref[br+ryi] - pref[bl+ryi] - pref[br+lyi-1] + pref[bl+lyi-1]
		k[i] = ki
		miss[i] = comb[N-ki]
	}

	total := comb[N]
	ans := int64(0)

	for i := 0; i < N; i++ {
		wi := b[i]
		lxi, rxi, lyi, ryi := lx[i], rx[i], ly[i], ry[i]
		ki := k[i]
		missi := miss[i]

		for j := 0; j < N; j++ {
			x1 := lxi
			if lx[j] > x1 {
				x1 = lx[j]
			}
			x2 := rxi
			if rx[j] < x2 {
				x2 = rx[j]
			}

			inter := 0
			if x1 <= x2 {
				y1 := lyi
				if ly[j] > y1 {
					y1 = ly[j]
				}
				y2 := ryi
				if ry[j] < y2 {
					y2 = ry[j]
				}
				if y1 <= y2 {
					br := x2 * S
					bl := (x1 - 1) * S
					inter = pref[br+y2] - pref[bl+y2] - pref[br+y1-1] + pref[bl+y1-1]
				}
			}

			u := ki + k[j] - inter
			cnt := total - missi - miss[j] + comb[N-u]
			cnt %= MOD
			if cnt < 0 {
				cnt += MOD
			}

			term := wi * b[j] % MOD
			term = term * cnt % MOD
			ans += term
			if ans >= MOD {
				ans -= MOD
			}
		}
	}

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