#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 main(){ cin.tie(0); int N, M; cin >> N >> M; Int ans = 0; init_fact(); for (int i = 1; i <= M; i++){ if ((M-i)%2){ ans += -1LL*(comb(M, i)*mod_pow(i, N))%MOD; }else{ ans += (comb(M, i)*mod_pow(i, N))%MOD; } ans += MOD; ans %= MOD; } cout << ans << endl; }