Problem:
Score : 500 points

Problem Statement

Count the pairs of length-N sequences consisting of integers between 1 and M (inclusive), A_1, A_2, \cdots, A_{N} and B_1, B_2, \cdots, B_{N}, that satisfy all of the following conditions:

A_i \neq B_i, for every i such that 1\leq i\leq N.

A_i \neq A_j and B_i \neq B_j, for every (i, j) such that 1\leq i < j\leq N.

Since the count can be enormous, print it modulo (10^9+7).

Constraints

1\leq N \leq M \leq 5\times10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M

Output

Print the count modulo (10^9+7).

Sample Input 1

2 2

Sample Output 1

2

A_1=1,A_2=2,B_1=2,B_2=1 and A_1=2,A_2=1,B_1=1,B_2=2 satisfy the conditions.

Sample Input 2

2 3

Sample Output 2

18

Sample Input 3

141421 356237

Sample Output 3

881613484

Solution in Kotlin (1.3.71) (judge verdict: Wrong Answer)

fun main() {
    val builder = StringBuilder()

    val mod = 1000000007L

    val (n, m) = readInputLine().split(" ").map { it.toInt() }

    // 1～mの階乗、逆元
    val factorial = LongArray(m + 1)
    val inverse = LongArray(m + 1)
    val factorialInverse = LongArray(m + 1)
    factorial[0] = 1L
    factorial[1] = 1L
    inverse[0] = 1L
    inverse[1] = 1L
    factorialInverse[0] = 1L
    factorialInverse[1] = 1L
    for (i in 2..m) {
        factorial[i] = (factorial[i - 1] * i.toLong() % mod)
        inverse[i] = (mod - inverse[mod.toInt() % i] * (mod / i.toLong()) % mod)
        factorialInverse[i] = (factorialInverse[i - 1] * inverse[i] % mod)
    }

    fun nCm(n: Int, m: Int): Long {
//        println("$n $m")
        return factorial[n] * (factorialInverse[m] * factorialInverse[n - m] % mod) % mod
    }

    // 全並べ方
    val allCnt = (factorial[m] * factorialInverse[m - n]) % mod

    // 各並べ方について、同じ数字を用いた際の要件を満たす並べ方はn - 1通り
    // それらの並べ方について、各数値のどこかを入れ替える
    var ans = (n - 1).toLong()

    for (i in 1..(m - n)) {
        if (i >= n) {
            break
        }
//        println("$i")
        ans = (ans + (n - 1).toLong() * nCm(n, i) % mod * nCm(m - n, i) % mod) % mod
    }

    // n * 2がm以下の場合は全入れ替えを考慮
    if (n * 2 <= m) {
        ans = (ans + (factorial[m - n] * factorialInverse[m - n * 2] % mod)) % mod
    }

    // 最後に全並べ方分かけたものが答え
    builder.appendln(ans * allCnt % mod)

    print(builder.toString())
}

fun readInputLine(): String {
    return readLine()!!
}