← Home
For problem statement at 0-999/600-699/620-629/622/problemF.txt this is a correct solution, but verifier at 0-999/600-699/620-629/622/verifierF.go ends with All tests passed can you fix the verifier? package main

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

const MOD int64 = 1000000007

func powmod(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)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var n int64
	var k int
	fmt.Fscan(in, &n, &k)

	m := k + 1
	y := make([]int64, m+1)
	ke := int64(k)

	for i := 1; i <= m; i++ {
		y[i] = y[i-1] + powmod(int64(i), ke)
		if y[i] >= MOD {
			y[i] -= MOD
		}
	}

	if n <= int64(m) {
		fmt.Fprintln(out, y[int(n)])
		return
	}

	factM := int64(1)
	for i := 1; i <= m; i++ {
		factM = factM * int64(i) % MOD
	}

	invfact := make([]int64, m+1)
	invfact[m] = powmod(factM, MOD-2)
	for i := m; i >= 1; i-- {
		invfact[i-1] = invfact[i] * int64(i) % MOD
	}

	nm := n % MOD
	pre := make([]int64, m+1)
	pre[0] = 1
	for i := 0; i < m; i++ {
		pre[i+1] = pre[i] * (nm - int64(i)) % MOD
	}

	ans := int64(0)
	suf := int64(1)
	for i := m; i >= 0; i-- {
		term := y[i]
		term = term * pre[i] % MOD
		term = term * suf % MOD
		term = term * invfact[i] % MOD
		term = term * invfact[m-i] % MOD

		if (m-i)&1 == 1 {
			ans -= term
			if ans < 0 {
				ans += MOD
			}
		} else {
			ans += term
			if ans >= MOD {
				ans -= MOD
			}
		}

		suf = suf * (nm - int64(i)) % MOD
	}

	fmt.Fprintln(out, ans)
}