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 C (GCC 9.2.1) (judge verdict: Accepted)

#include <stdio.h>
#define MOD 1000000007
#define N 500001
typedef long long ll;

ll fac[N], inv[N];
ll C(int n, int r) {return fac[n] * inv[n - r] % MOD * inv[r] % MOD;}
ll P(int n, int r) {return fac[n] * inv[n - r] % MOD;}

ll power(ll a, ll n)
{
    ll ans = 1;
    while(n)
    {
        if(n & 1) ans = ans * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return ans;
}

int main()
{
    int n, m;

    scanf("%d%d", &n, &m);

    fac[0] = 1;
    for(int i = 1; i <= m; i++) fac[i] = fac[i - 1] * i % MOD;

    inv[m] = power(fac[m],MOD - 2);//find the inverse fac[m]
    //inverse(n)*n! == n! / n == (n - 1)!
    for(int i = m - 1; i >= 0; i--) inv[i] = inv[i + 1]*(i + 1) % MOD;

    ll ans = 0, sym = 1;
    for(int i = 0; i <= n; i++) 
    {
        ans += sym*C(n,i)*P(m - i,n - i) % MOD;
        sym *= -1;
    }
    ans = (ans % MOD + MOD) % MOD;
    printf("%lld\n", ans * P(m,n) % MOD);

    return 0;
}