← Home
For problem statement at 1000-1999/1100-1199/1110-1119/1111/problemD.txt this is a correct solution, but verifier at 1000-1999/1100-1199/1110-1119/1111/verifierD.go ends with All 100 tests passed. can you fix the verifier? ```go
package main

import (
	"bufio"
	"os"
)

const MOD = 1000000007

func power(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 modInverse(n int64) int64 {
	return power(n, MOD-2)
}

func charIdx(c byte) int {
	if c >= 'a' && c <= 'z' {
		return int(c - 'a')
	}
	return int(c - 'A') + 26
}

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

	if !scanner.Scan() {
		return
	}
	s := scanner.Bytes()
	n := len(s)
	if n == 0 {
		return
	}

	if !scanner.Scan() {
		return
	}
	q := 0
	for _, b := range scanner.Bytes() {
		q = q*10 + int(b-'0')
	}

	freq := make([]int, 52)
	for i := 0; i < n; i++ {
		freq[charIdx(s[i])]++
	}

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

	dp := make([]int64, n/2+1)
	dp[0] = 1

	var types []int
	for i := 0; i < 52; i++ {
		if freq[i] > 0 {
			types = append(types, i)
			f := freq[i]
			for w := n / 2; w >= f; w-- {
				dp[w] = (dp[w] + dp[w-f])
				if dp[w] >= MOD {
					dp[w] -= MOD
				}
			}
		}
	}

	K := fact[n/2] * fact[n/2] % MOD
	for i := 0; i < 52; i++ {
		if freq[i] > 0 {
			K = K * invFact[freq[i]] % MOD
		}
	}

	ans := make([][]int64, 52)
	for i := 0; i < 52; i++ {
		ans[i] = make([]int64, 52)
	}

	baseAns := K * dp[n/2] % MOD
	for i := 0; i < 52; i++ {
		ans[i][i] = baseAns
	}

	for _, i := range types {
		fi := freq[i]
		dpi := make([]int64, n/2+1)
		copy(dpi, dp)
		for w := fi; w <= n/2; w++ {
			dpi[w] = dpi[w] - dpi[w-fi]
			if dpi[w] < 0 {
				dpi[w] += MOD
			}
		}

		for _, j := range types {
			if i >= j {
				continue
			}
			fj := freq[j]
			M := n/2 - fi - fj
			if M < 0 {
				ans[i][j] = 0
				ans[j][i] = 0
				continue
			}

			sum := int64(0)
			for w := M; w >= 0; w -= 2 * fj {
				sum += dpi[w]
			}
			for w := M - fj; w >= 0; w -= 2 * fj {
				sum -= dpi[w]
			}
			sum %= MOD
			if sum < 0 {
				sum += MOD
			}

			res := (2 * K % MOD) * sum % MOD
			ans[i][j] = res
			ans[j][i] = res
		}
	}

	var outBuf []byte
	var b [20]byte

	for k := 0; k < q; k++ {
		scanner.Scan()
		x := 0
		for _, bt := range scanner.Bytes() {
			x = x*10 + int(bt-'0')
		}
		scanner.Scan()
		y := 0
		for _, bt := range scanner.Bytes() {
			y = y*10 + int(bt-'0')
		}

		x--
		y--
		u := charIdx(s[x])
		v := charIdx(s[y])
		res := ans[u][v]

		if res == 0 {
			outBuf = append(outBuf, '0', '\n')
		} else {
			idx := 20
			for res > 0 {
				idx--
				b[idx] = byte(res%10 + '0')
				res /= 10
			}
			outBuf = append(outBuf, b[idx:]...)
			outBuf = append(outBuf, '\n')
		}
	}
	os.Stdout.Write(outBuf)
}
```