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>
#include <stdlib.h>

#define ll long long
#define ARR_SIZE 510000
#define MOD ((ll)1e9 + 7)

ll modpow(ll n, ll r){
    ll res = 1;
    while(r>0){
        if(r%2==1) res = res*n%MOD;
        n = n*n%MOD;
        r /= 2;
    }
    return res;
}

ll modinv(ll n){
    return modpow(n, MOD-2);
}

ll fact[ARR_SIZE] = {1, 1};
ll factinv[ARR_SIZE] = {1, 1};

ll comb(ll n, ll r){
    return (fact[n] * factinv[r] %MOD) * factinv[n-r] %MOD;
}

ll perm(ll n, ll r){
    return fact[n] * factinv[n-r] %MOD;
}

int main(){
    int n, m;
    scanf("%d %d", &n, &m);
    // end input

    for(int i=2;i<ARR_SIZE;i++){
        fact[i] = fact[i-1]*i%MOD;
    }
    factinv[ARR_SIZE-1] = modinv(fact[ARR_SIZE-1]);
    for(int i=ARR_SIZE-1;i>0;i--){
        factinv[i-1] = factinv[i]*i%MOD;
    }

    ll ans = 0;
    for(int i=0;i<=n;i++){
        ll t1 = comb(n,i)*perm(m,i)%MOD;
        ll t2 = modpow(perm(m-i, n-i), 2);
        ans += t1*t2%MOD * modpow(-1, i);

        ans = (ans%MOD + MOD)%MOD;
    }
    printf("%lld\n", ans);
    return 0;
}