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

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

	if k == 0 {
		fmt.Fprint(out, n%MOD)
		return
	}

	k64 := int64(k)
	d := k + 1

	if n <= int64(d) {
		ans := int64(0)
		limit := int(n)
		for i := 1; i <= limit; i++ {
			ans += modPow(int64(i), k64)
			if ans >= MOD {
				ans -= MOD
			}
		}
		fmt.Fprint(out, ans)
		return
	}

	m := d + 1

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

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

	suf := make([]int64, m+1)
	suf[m] = 1
	x := n % MOD
	for i := m - 1; i >= 0; i-- {
		suf[i] = suf[i+1] * (x - int64(i)) % MOD
	}

	ans := int64(0)
	pre := int64(1)
	for i := 0; i < m; i++ {
		num := pre * suf[i+1] % MOD
		term := y[i] * num % MOD
		term = term * invFact[i] % MOD
		term = term * invFact[d-i] % MOD
		if (d-i)&1 == 1 {
			ans -= term
			if ans < 0 {
				ans += MOD
			}
		} else {
			ans += term
			if ans >= MOD {
				ans -= MOD
			}
		}
		pre = pre * (x - int64(i)) % MOD
	}

	fmt.Fprint(out, ans)
}