const int Mod = 1e9 + 7;int n, m, d[1000010], fac[1000010], ifac[1000010], h[1000010], stl[1010][1010], stl1[50010][205];int qp(int x, int y){ // 快速幂x %= Mod;int res = 1;while(y){if(y & 1) (res *= x) %= Mod;(x *= x) %= Mod;y >>= 1;}return res;
}void init(){ // 阶乘、逆元预处理ifac[0] = fac[0] = 1;for(int i = 1; i <= 1000; i ++) fac[i] = fac[i - 1] * i % Mod;for(int i = 1; i <= 1000; i ++) ifac[i] = qp(fac[i], Mod - 2);
}void inith(){ // 卡特兰数h[0] = 1;for(int i = 1; i <= 1000000; i ++) h[i] = h[i - 1] * (4 * i - 2) % Mod * qp(i + 1, Mod - 2) % Mod;
}int C(int x, int y){ // 组合数return fac[x] % Mod * ifac[y] % Mod * ifac[x - y] % Mod;
}void init2(){ // 错排d[0] = 1, d[1] = 0, d[2] = 1;for(int i = 3; i <= 1000000; i ++) d[i] = (i - 1) * (d[i - 1] + d[i - 2]) % Mod;
}int calt(int x, bool k){ // 卡特兰; 1:预处理;2:现场处理if(k) return h[x];return (C(2 * x, x) - C(2 * x, x - 1) % Mod + Mod) % Mod;
}void initstl(){ // 第二类斯特林数stl[0][0] = 1;for(int i = 1; i <= 1000; i ++){for(int j = 1; j <= i; j ++){stl[i][j] = (stl[i - 1][j - 1] + j * stl[i - 1][j] % Mod) % Mod;}}
}void initstl1(){// 第一类斯特林数stl1[0][0] = 1;for(int i = 1; i <= 50000; i ++){for(int j = 1; j <= min(i, 200ll); j ++){stl1[i][j] = (stl1[i - 1][j - 1] + (i - 1) * stl1[i - 1][j] % Mod) % Mod;}}
}
