← Home
For problem statement at 1000-1999/1900-1999/1990-1999/1992/problemG.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1990-1999/1992/verifierG.go ends with All tests passed! can you fix the verifier? package main

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

const MOD int64 = 1000000007

var fact, ifact []int64

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 comb(n, k int) int64 {
	if k < 0 || k > n {
		return 0
	}
	return fact[n] * ifact[k] % MOD * ifact[n-k] % MOD
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var t int
	fmt.Fscan(in, &t)
	ns := make([]int, t)
	mx := 0
	for i := 0; i < t; i++ {
		fmt.Fscan(in, &ns[i])
		if ns[i] > mx {
			mx = ns[i]
		}
	}

	limit := mx + 1
	fact = make([]int64, limit+1)
	ifact = make([]int64, limit+1)
	fact[0] = 1
	for i := 1; i <= limit; i++ {
		fact[i] = fact[i-1] * int64(i) % MOD
	}
	ifact[limit] = modPow(fact[limit], MOD-2)
	for i := limit; i >= 1; i-- {
		ifact[i-1] = ifact[i] * int64(i) % MOD
	}

	memo := make([]int64, mx+1)
	for i := range memo {
		memo[i] = -1
	}

	for _, n := range ns {
		if memo[n] == -1 {
			ans := int64(0)
			for m := 0; m <= (n-1)/2; m++ {
				term := int64(m+1) * comb(n+1, m) % MOD
				ans += term
				if ans >= MOD {
					ans -= MOD
				}
			}
			for m := (n + 1) / 2; m <= n; m++ {
				term := int64(2*m+1) % MOD * comb(n, m) % MOD
				ans += term
				if ans >= MOD {
					ans -= MOD
				}
			}
			memo[n] = ans
		}
		fmt.Fprintln(out, memo[n])
	}
}