← Home
```go
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 k int
	var w int64
	fmt.Fscan(in, &k, &w)

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

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

	K := int64(k) % MOD
	invK := modPow(K, MOD-2)
	invK2 := invK * invK % MOD
	powWR := modPow(K, w-1)

	ans := int64(0)

	for r := 1; r <= k; r++ {
		var d, e int64

		if int64(r) <= w {
			p := perm(k, r)
			d = p * p % MOD * powWR % MOD
		} else {
			ww := int(w)
			o := r - ww
			po := perm(k, o)
			pw := perm(k-o, ww)
			d = po * pw % MOD * pw % MOD
		}

		if r < k {
			if int64(r) <= w-2 {
				p := perm(k, r+1)
				e = p * p % MOD * powWR % MOD * invK2 % MOD
			} else if int64(r) >= w-1 {
				ww1 := int(w - 1)
				o := r - ww1 + 1
				po := perm(k, o)
				pw := perm(k-o, ww1)
				e = po * pw % MOD * pw % MOD
			}
		}

		ans += d - e
		ans %= MOD
		powWR = powWR * invK % MOD
	}

	if ans < 0 {
		ans += MOD
	}
	fmt.Fprintln(out, ans)
}
```