#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") using namespace std; typedef long double ld; typedef long long int ll; typedef unsigned long long int ull; typedef vector vi; typedef vector vc; typedef vector vb; typedef vector vd; typedef vector vs; typedef vector vll; typedef vector> vpii; typedef vector> vpll; typedef vector vvi; typedef vector vvvi; typedef vector vvc; typedef vector vvs; typedef vector vvll; typedef pair P; typedef map mii; typedef set si; #define rep(i, n) for (ll i = 0; i < (n); ++i) #define rrep(i, n) for (int i = 1; i <= (n); ++i) #define irep(it, stl) for (auto it = stl.begin(); it != stl.end(); it++) #define drep(i, n) for (int i = (n)-1; i >= 0; --i) #define fin(ans) cout << (ans) << '\n' #define STLL(s) strtoll(s.c_str(), NULL, 10) #define mp(p, q) make_pair(p, q) #define pb(n) push_back(n) #define all(a) a.begin(), a.end() #define Sort(a) sort(a.begin(), a.end()) #define Rort(a) sort(a.rbegin(), a.rend()) #define fi first #define se second // #include // using namespace atcoder; constexpr int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1}; constexpr int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1}; template inline bool chmax(T& a, U b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, U b) { if (a > b) { a = b; return 1; } return 0; } template ostream& operator<<(ostream& os, pair& p) { cout << "(" << p.first << ", " << p.second << ")"; return os; } template inline void dump(T& v) { irep(i, v) { cout << (*i) << ((i == --v.end()) ? '\n' : ' '); } } template inline void dump(map& v) { if (v.size() > 100) { cout << "ARRAY IS TOO LARGE!!!" << endl; } else { irep(i, v) { cout << i->first << " " << i->second << '\n'; } } } template inline void dump(pair& p) { cout << p.first << " " << p.second << '\n'; } inline void yn(const bool b) { b ? fin("yes") : fin("no"); } inline void Yn(const bool b) { b ? fin("Yes") : fin("No"); } inline void YN(const bool b) { b ? fin("YES") : fin("NO"); } void Case(int i) { printf("Case #%d: ", i); } const int INF = INT_MAX; constexpr ll LLINF = 1LL << 61; constexpr ld EPS = 1e-11; #define MODTYPE 0 #if MODTYPE == 0 constexpr ll MOD = 1000000007; #else constexpr ll MOD = 998244353; #endif /* -------------------- ここまでテンプレ -------------------- */ struct mint { ll x; mint(ll _x = 0) : x((_x % MOD + MOD) % MOD) {} /* 初期化子 */ mint operator+() const { return mint(x); } mint operator-() const { return mint(-x); } /* 代入演算子 */ mint& operator+=(const mint a) { if ((x += a.x) >= MOD) x -= MOD; return *this; } mint& operator-=(const mint a) { if ((x += MOD - a.x) >= MOD) x -= MOD; return *this; } mint& operator*=(const mint a) { (x *= a.x) %= MOD; return *this; } mint& operator/=(const mint a) { x *= modinv(a).x; x %= MOD; return (*this); } mint& operator%=(const mint a) { x %= a.x; return (*this); } mint& operator++() { ++x; if (x >= MOD) x -= MOD; return *this; } mint& operator--() { if (!x) x += MOD; --x; return *this; } mint& operator&=(const mint a) { x &= a.x; return (*this); } mint& operator|=(const mint a) { x |= a.x; return (*this); } mint& operator^=(const mint a) { x ^= a.x; return (*this); } mint& operator<<=(const mint a) { x *= pow(2, a).x; return (*this); } mint& operator>>=(const mint a) { x /= pow(2, a).x; return (*this); } /* 算術演算子 */ mint operator+(const mint a) const { mint res(*this); return res += a; } mint operator-(const mint a) const { mint res(*this); return res -= a; } mint operator*(const mint a) const { mint res(*this); return res *= a; } mint operator/(const mint a) const { mint res(*this); return res /= a; } mint operator%(const mint a) const { mint res(*this); return res %= a; } mint operator&(const mint a) const { mint res(*this); return res &= a; } mint operator|(const mint a) const { mint res(*this); return res |= a; } mint operator^(const mint a) const { mint res(*this); return res ^= a; } mint operator<<(const mint a) const { mint res(*this); return res <<= a; } mint operator>>(const mint a) const { mint res(*this); return res >>= a; } /* 条件演算子 */ bool operator==(const mint a) const noexcept { return x == a.x; } bool operator!=(const mint a) const noexcept { return x != a.x; } bool operator<(const mint a) const noexcept { return x < a.x; } bool operator>(const mint a) const noexcept { return x > a.x; } bool operator<=(const mint a) const noexcept { return x <= a.x; } bool operator>=(const mint a) const noexcept { return x >= a.x; } /* ストリーム挿入演算子 */ friend istream& operator>>(istream& is, mint& m) { is >> m.x; m.x = (m.x % MOD + MOD) % MOD; return is; } friend ostream& operator<<(ostream& os, const mint& m) { os << m.x; return os; } /* その他の関数 */ mint modinv(mint a) { return pow(a, MOD - 2); } mint pow(mint x, mint n) { mint res = 1; while (n.x > 0) { if ((n % 2).x) res *= x; x *= x; n.x /= 2; } return res; } mint powll(mint x, ll n) { mint res = 1; while (n > 0) { if (n % 2) res *= x; x *= x; n /= 2; } return res; } }; #define MAX_MINT_NCK 201010 mint f[MAX_MINT_NCK], rf[MAX_MINT_NCK]; bool isinit = false; void init() { f[0] = 1; rf[0] = 1; for (int i = 1; i < MAX_MINT_NCK; i++) { f[i] = f[i - 1] * i; rf[i] = f[i].pow(f[i], MOD - 2); } } mint nCk(mint n, mint k) { if (n < k) return 0; if (!isinit) { init(); isinit = 1; } mint nl = f[n.x]; // n! mint nkl = rf[n.x - k.x]; // (n-k)! mint kl = rf[k.x]; // k! mint nkk = (nkl.x * kl.x); return nl * nkk; } int main() { ll n, k; cin >> n >> k; mint ans = 0; for (ll i = 0; i <= k; i++) { ans += mint(1).pow(-1, i) * nCk(k, i) * mint(1).powll(k - i, n); } cout << ans << endl; }