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 N 500000
#define maxn (N + 10)
#define maxm (maxn * 2)
#define pb push_back
#define lc (id * 2)
#define rc (id * 2 + 1)
#define Mod(x) (((x) % mod + mod) % mod)
typedef long long ll;
const ll INF = (1e8);
const ll mod = (1e9 + 7);
ll pw[maxn],iv[maxn];
ll f_pow(ll x,ll p){
    ll ans = 1;
    while(p){
        if(p % 2 == 1){
            ans *= x;ans %= mod;
        }
        x *= x;x %= mod;p /= 2;
    }
    return ans;
}
void init(){
    pw[0] = 1;
    for(ll i = 1;i <= N;i++){
        pw[i] = pw[i - 1] * i;pw[i] %= mod;
    }
    iv[N] = f_pow(pw[N],mod - 2);
    //printf("iv[N] = %lld\n",iv[N]);
    for(ll i = N - 1;i >= 0;i--){
        iv[i] = iv[i + 1] * (i + 1);iv[i] %= mod;
    }
    //iv[0] = 1;
    //printf("iv0 = %lld\n",iv[0]);
}
ll C(ll x,ll y){
    ll ans = pw[x];ans *= iv[y];ans %= mod;ans *= iv[x - y];ans %= mod;
    return ans;
}
int main(){
    init();
    ll n,m;scanf("%lld%lld",&n,&m);
    ll ans = 0;
    for(ll i = 0;i <= n;i++){
        ll cnt = ((i % 2 == 0) ? 1 : -1);
        //printf("cnt1 = %lld\n",cnt);
        cnt *= C(m,i);cnt = Mod(cnt);
        //printf("cnt2 = %lld\n",cnt);
        cnt *= C(n,i);cnt = Mod(cnt);
        //printf("cnt3 = %lld\n",cnt);
        cnt *= pw[i]; cnt = Mod(cnt);
        //printf("cnt4 = %lld\n",cnt);
        cnt *= C(m - i,n - i);cnt = Mod(cnt);
        //printf("cnt5 = %lld\n",cnt);
        cnt *= pw[n - i];cnt = Mod(cnt);
        //printf("cnt6 = %lld\n",cnt);
        cnt *= C(m - i,n - i);cnt = Mod(cnt);
        //printf("cnt7 = %lld\n",cnt);
        cnt *= pw[n - i];cnt = Mod(cnt);
        ans += cnt;ans %= mod;
        //printf("ans = %lld cnt = %lld\n",ans,cnt);
    }
    printf("%lld\n",ans);
    return 0;
}