← Home
For problem statement at 1000-1999/1000-1099/1040-1049/1045/problemH.txt this is a correct solution, but verifier at 1000-1999/1000-1099/1040-1049/1045/verifierH.go ends with Wrong answer on test 12 (random-positive-11): expected 2 got 3
Input:
1101010010100010111
1101010010100100000
3
6
6
3

exit status 1 can you fix the verifier? package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"strconv"
	"strings"
)

const MOD = 1000000007
const MAX = 400005

var fact [MAX]int64
var invFact [MAX]int64

func power(base, exp int64) int64 {
	var 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 init() {
	fact[0] = 1
	invFact[0] = 1
	for i := 1; i < MAX; i++ {
		fact[i] = (fact[i-1] * int64(i)) % MOD
	}
	invFact[MAX-1] = power(fact[MAX-1], MOD-2)
	for i := MAX - 2; i >= 1; i-- {
		invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
	}
}

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

func getWays(start_bit int, c00, c01, c10, c11 int) int64 {
	if c00 < 0 || c01 < 0 || c10 < 0 || c11 < 0 {
		return 0
	}
	if start_bit == 1 {
		if c10 == c01 {
			if c10 == 0 {
				if c00 == 0 {
					return 1
				}
				return 0
			}
			return (nCr(c11+c10, c10) * nCr(c00+c10-1, c10-1)) % MOD
		} else if c10 == c01+1 {
			if c10 == 0 {
				return 0
			}
			return (nCr(c11+c10-1, c10-1) * nCr(c00+c10-1, c10-1)) % MOD
		}
		return 0
	} else {
		if c01 == c10 {
			if c01 == 0 {
				if c11 == 0 {
					return 1
				}
				return 0
			}
			return (nCr(c00+c01, c01) * nCr(c11+c01-1, c01-1)) % MOD
		} else if c01 == c10+1 {
			if c01 == 0 {
				return 0
			}
			return (nCr(c00+c01-1, c01-1) * nCr(c11+c01-1, c01-1)) % MOD
		}
		return 0
	}
}

func countLessEq(X string, c00, c01, c10, c11 int) int64 {
	if len(X) > c00+c01+c10+c11+1 {
		return getWays(1, c00, c01, c10, c11)
	}
	if len(X) < c00+c01+c10+c11+1 {
		return 0
	}

	var ans int64 = 0
	curr_c := []int{c00, c01, c10, c11}

	for i := 0; i < len(X); i++ {
		if i > 0 && X[i] == '1' {
			prev := X[i-1] - '0'
			idx := prev*2 + 0

			temp_c := make([]int, 4)
			copy(temp_c, curr_c)
			temp_c[idx]--

			if temp_c[idx] >= 0 {
				ans = (ans + getWays(0, temp_c[0], temp_c[1], temp_c[2], temp_c[3])) % MOD
			}
		}

		if i > 0 {
			prev := X[i-1] - '0'
			curr := X[i] - '0'
			idx := prev*2 + curr
			curr_c[idx]--
			if curr_c[idx] < 0 {
				break
			}
		}
	}

	if curr_c[0] == 0 && curr_c[1] == 0 && curr_c[2] == 0 && curr_c[3] == 0 {
		ans = (ans + 1) % MOD
	}

	return ans
}

func isValid(X string, c00, c01, c10, c11 int) int64 {
	if len(X) != c00+c01+c10+c11+1 {
		return 0
	}
	t00, t01, t10, t11 := 0, 0, 0, 0
	for i := 0; i < len(X)-1; i++ {
		if X[i] == '0' && X[i+1] == '0' {
			t00++
		}
		if X[i] == '0' && X[i+1] == '1' {
			t01++
		}
		if X[i] == '1' && X[i+1] == '0' {
			t10++
		}
		if X[i] == '1' && X[i+1] == '1' {
			t11++
		}
	}
	if t00 == c00 && t01 == c01 && t10 == c10 && t11 == c11 {
		return 1
	}
	return 0
}

func main() {
	bytes_arr, err := ioutil.ReadAll(os.Stdin)
	if err != nil {
		return
	}
	tokens := strings.Fields(string(bytes_arr))
	if len(tokens) < 6 {
		return
	}
	A := tokens[0]
	B := tokens[1]
	c00, _ := strconv.Atoi(tokens[2])
	c01, _ := strconv.Atoi(tokens[3])
	c10, _ := strconv.Atoi(tokens[4])
	c11, _ := strconv.Atoi(tokens[5])

	ans := (countLessEq(B, c00, c01, c10, c11) - countLessEq(A, c00, c01, c10, c11) + isValid(A, c00, c01, c10, c11)) % MOD
	if ans < 0 {
		ans += MOD
	}
	fmt.Println(ans)
}