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 <bits/stdc++.h>
using namespace std;
#define ll    long long
#define F     first
#define S     second
#define pb    push_back
#define mp    make_pair
#define mod   1000000007
#define vlli  vector<ll>
#define vi    vector<int>
#define vs    vector<string>
#define vplli vector< pair< ll, ll> >
#define plli  pair< ll, ll >
#define vps   vector< pair< string, string> >
#define vpi   vector< pair< int, int> >
#define all(x)           x.begin(), x.end()
#define fast  ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define forn(i, n)       for (ll i = 0; i < n; i++)
#define print(arr, a, n) for (ll i = (a); i < (n); i++) cout << (arr)[i] << " ";

const ll INF = (ll)2e18 + 77;
const int N = (int)1e6 + 1;
ll fact[N], invfact[N];
ll modpo(ll x, ll n){
    ll ans = 1;

    while (n > 0) {
        if (n & 1)
            ans = (ans * x) % mod;
        x = (x * x) % mod;
        n >>= 1;
    }
    return ans;
}
void modin(){
    ll i;

    fact[0] = invfact[0] = 1;

    for (ll i = 1; i < N; i++) {
        fact[i] = (fact[i - 1] * i) % mod;
        invfact[i] = modpo(fact[i], mod - 2);
    }
}
ll nCr(ll n, ll r){
    if (r > n) return 0;
    ll ans = fact[n];

    ans = (ans * invfact[r]) % mod;
    ans = (ans * invfact[n - r]) % mod;
    return ans;
}
void solve(){
    ll N, M, i, ans = 0, sign = 1, temp; cin >> N >> M;

    modin();
    forn(i, N + 1){
        temp = sign; if (temp < 0) temp += mod;
        temp = (temp * nCr(N, i)) % mod;
        temp = (temp * nCr(M - i, N - i)) % mod;
        temp = (temp * fact[N - i]) % mod;
        ans = (ans + temp) % mod;
        sign = -sign;
    }
    ans = (ans * nCr(M, N)) % mod;
    ans = (ans * fact[N]) % mod;
    cout << ans % mod << "\n";
}
int main(){
    
    fast;
    solve();

    return 0;
}