← Home
For problem statement at 0-999/200-299/240-249/248/problemE.txt this is a correct solution, but verifier at 0-999/200-299/240-249/248/verifierE.go ends with All 100 tests passed can you fix the verifier? package main

import (
	"bufio"
	"os"
	"strconv"
)

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

	readInt := func() int {
		scanner.Scan()
		res, _ := strconv.Atoi(scanner.Text())
		return res
	}

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	C := make([]int, n+1)
	P := make([][]float64, n+1)

	for i := 1; i <= n; i++ {
		a := readInt()
		C[i] = a
		P[i] = make([]float64, a+1)
		P[i][a] = 1.0
	}

	var comb [6][6]float64
	for i := 0; i <= 5; i++ {
		comb[i][0] = 1.0
		for j := 1; j <= i; j++ {
			comb[i][j] = comb[i-1][j-1] + comb[i-1][j]
		}
	}

	const blockSize = 500
	numBlocks := (n + blockSize) / blockSize
	blockSum := make([]float64, numBlocks)

	for i := 1; i <= n; i++ {
		blockIdx := i / blockSize
		blockSum[blockIdx] += P[i][0]
	}

	q := readInt()

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	temp := make([]float64, 105)

	for iter := 0; iter < q; iter++ {
		u := readInt()
		v := readInt()
		k := readInt()

		l := len(P[u])
		for x := 0; x < l; x++ {
			temp[x] = 0.0
		}

		for x := 0; x < l; x++ {
			if P[u][x] == 0 {
				continue
			}
			for j := 0; j <= k; j++ {
				if j > x || k-j > C[u]-x {
					continue
				}
				prob := comb[k][j]
				for i := 0; i < j; i++ {
					prob *= float64(x-i) / float64(C[u]-i)
				}
				for i := 0; i < k-j; i++ {
					prob *= float64(C[u]-x-i) / float64(C[u]-j-i)
				}
				temp[x-j] += P[u][x] * prob
			}
		}

		for x := 0; x < l; x++ {
			P[u][x] = temp[x]
		}

		C[u] -= k
		C[v] += k

		blockIdx := u / blockSize
		sum := 0.0
		start := blockIdx * blockSize
		end := start + blockSize
		if end > n+1 {
			end = n + 1
		}
		if start == 0 {
			start = 1
		}
		for i := start; i < end; i++ {
			sum += P[i][0]
		}
		blockSum[blockIdx] = sum

		E := 0.0
		for i := 0; i < numBlocks; i++ {
			E += blockSum[i]
		}

		out.WriteString(strconv.FormatFloat(E, 'f', 12, 64))
		out.WriteByte('\n')
	}
}