#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include const double EPS = (1e-10); using namespace std; using Int = long long; //using namespace boost::multiprecision; const Int MOD = 1000000007; const int MAXN = 1000000; Int fact[MAXN], inv[MAXN]; Int mod_pow(Int x, Int n) { Int res = 1; while(n > 0) { if(n & 1) res = (res * x) % MOD; //ビット演算(最下位ビットが1のとき) x = (x * x) % MOD; n >>= 1; //右シフト(n = n >> 1) } return res; } void init_fact() { fact[0] = 1; for(int i=1; i=0; i--) { inv[i] = (inv[i+1] * (i+1)) % MOD; } } Int comb(int n, int r) { if(r < 0 || n < r) return 0; return fact[n] * inv[n-r] % MOD * inv[r] % MOD; } template T gcd(T a, T b) { return b != 0 ? gcd(b, a % b) : a; } template T lcm(T a, T b) { return a * b / gcd(a, b); } Int dp[1005][1005]; Int rec(int n, int m){ if (dp[n][m]) return dp[n][m]; if (n == 0) return dp[n][m] = 1; if (n > m){ dp[n][m] += (rec(n-1, m) * m)%MOD; dp[n][m] %= MOD; } dp[n][m] += (rec(n-1, m-1) * m)%MOD; dp[n][m] %= MOD; return dp[n][m]; } int main(){ cin.tie(0); int N, M; cin >> N >> M; cout << rec(N, M) << endl; }