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)
}