← Home
For problem statement at 0-999/300-399/330-339/336/problemD.txt this is a correct solution, but verifier at 0-999/300-399/330-339/336/verifierD.go ends with All tests passed can you fix the verifier? package main

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

const MOD int64 = 1000000007

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

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)

	var n, m, g int
	fmt.Fscan(in, &n, &m, &g)

	if m == 0 {
		if ((n - 1) & 1) == g {
			fmt.Println(1)
		} else {
			fmt.Println(0)
		}
		return
	}

	if m == 1 {
		ans := 0
		if g == 0 {
			ans += (n + 1) / 2
		} else {
			ans += n / 2
		}
		if (1^(n&1)) == g {
			ans++
		}
		fmt.Println(ans % int(MOD))
		return
	}

	N := n + m
	fac := make([]int64, N+1)
	invfac := make([]int64, N+1)

	fac[0] = 1
	for i := 1; i <= N; i++ {
		fac[i] = fac[i-1] * int64(i) % MOD
	}

	invfac[N] = modPow(fac[N], MOD-2)
	for i := N; i >= 1; i-- {
		invfac[i-1] = invfac[i] * int64(i) % MOD
	}

	comb := func(a, b int) int64 {
		if b < 0 || b > a {
			return 0
		}
		return fac[a] * invfac[b] % MOD * invfac[a-b] % MOD
	}

	var ans int64
	for l := g; l <= n; l += 2 {
		ans += comb(N-l-1, m-1)
		if ans >= MOD {
			ans -= MOD
		}
	}

	fmt.Println(ans)
}