← Home
For problem statement at 0-999/700-799/700-709/708/problemE.txt this is a correct solution, but verifier at 0-999/700-799/700-709/708/verifierE.go ends with All tests passed can you fix the verifier? ```go
package main

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

const MOD int64 = 1000000007

func modPow(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, m int
	fmt.Fscan(reader, &n, &m)
	var a, b int64
	fmt.Fscan(reader, &a, &b)
	var k int
	fmt.Fscan(reader, &k)

	p_mod := (a * modPow(b, MOD-2)) % MOD
	one_minus_p := (1 - p_mod + MOD) % MOD

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

	nCr := func(n, r int) int64 {
		if r < 0 || r > n {
			return 0
		}
		return fact[n] * invFact[r] % MOD * invFact[n-r] % MOD
	}

	g := make([]int64, m)
	for v := 0; v < m; v++ {
		if v > k {
			g[v] = 0
		} else {
			prob := nCr(k, v)
			prob = (prob * modPow(p_mod, int64(v))) % MOD
			prob = (prob * modPow(one_minus_p, int64(k-v))) % MOD
			g[v] = prob
		}
	}

	prefG := make([]int64, m+1)
	for i := 0; i < m; i++ {
		prefG[i+1] = (prefG[i] + g[i]) % MOD
	}

	f := make([]int64, m)
	for x := 0; x < m; x++ {
		limit := m - 1 - x
		if limit >= 0 {
			f[x] = prefG[limit+1]
		} else {
			f[x] = 0
		}
	}

	SumG := make([]int64, m)
	SumG[0] = g[0]
	for i := 1; i < m; i++ {
		SumG[i] = (SumG[i-1] + g[i]) % MOD
	}

	C := make([]int64, m)
	E := make([]int64, m)
	for v := 0; v < m; v++ {
		C[v] = f[v]
		E[v] = (f[v] * SumG[v]) % MOD
	}

	for i := 2; i <= n; i++ {
		SumGC := make([]int64, m)
		SumGCF := make([]int64, m)
		currSumGC := int64(0)
		currSumGCF := int64(0)
		for v := 0; v < m; v++ {
			termC := (g[v] * C[v]) % MOD
			currSumGC = (currSumGC + termC) % MOD
			SumGC[v] = currSumGC

			termCF := (termC * f[v]) % MOD
			currSumGCF = (currSumGCF + termCF) % MOD
			SumGCF[v] = currSumGCF
		}

		TotGCF := SumGCF[m-1]

		K := make([]int64, m)
		SumGK := make([]int64, m)
		currSumGK := int64(0)
		for v := 0; v < m; v++ {
			K[v] = (E[v] - SumGC[v] + MOD) % MOD
			termK := (g[v] * K[v]) % MOD
			currSumGK = (currSumGK + termK) % MOD
			SumGK[v] = currSumGK
		}

		C_new := make([]int64, m)
		E_new := make([]int64, m)
		for v := 0; v < m; v++ {
			term1 := (f[v] * E[v]) % MOD
			C_new[v] = (term1 + TotGCF - SumGCF[v] + MOD) % MOD

			termE1 := (f[v] * SumGK[v]) % MOD
			termE2a := (f[v] * SumGC[v]) % MOD
			termE2b := (TotGCF - SumGCF[v] + MOD) % MOD
			termE2 := (termE2a + termE2b) % MOD
			termE2 = (termE2 * SumG[v]) % MOD
			E_new[v] = (termE1 + termE2) % MOD
		}

		C = C_new
		E = E_new
	}

	ans := int64(0)
	for v := 0; v < m; v++ {
		term := (g[v] * C[v]) % MOD
		ans = (ans + term) % MOD
	}

	fmt.Println(ans)
}
```