1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
#include <cstdio> #include <algorithm> using namespace std; const int MAXN = 1e6+5; const int P = 998244353, G = 3, iG = 332748118; int fpow(int base, int b, int m = P) { int ret = 1; while (b > 0) { if (b & 1) ret = 1LL * ret * base % m; base = 1LL * base * base % m, b >>= 1; } return ret; } namespace Poly { int r[MAXN]; inline void init(const int& Lim, const int& L) { for (int i = 1; i < Lim; ++i) r[i] = (r[i>>1] >> 1) | ((i & 1) << (L-1)); } void NTT(int* f, int Lim, int type) { for (int i = 1; i < Lim; ++i) if (i < r[i]) swap(f[i], f[r[i]]); for (int Mid = 1; Mid < Lim; Mid <<= 1) { int unit = fpow(type > 0? G: iG, (P-1) / (Mid << 1)); for (int i = 0; i < Lim; i += Mid << 1) { int w = 1; for (int j = 0; j < Mid; ++j, w = 1LL * w * unit % P) { int f0 = f[i+j], f1 = 1LL * w * f[i+j+Mid] % P; f[i+j] = (f0 + f1) % P, f[i+j+Mid] = (f0 - f1 + P) % P; } } } if (type < 0) { int inv = fpow(Lim, P-2); for (int i = 0; i < Lim; ++i) f[i] = 1LL * f[i] * inv % P; } } } int n, K; int f[MAXN], g[MAXN]; int inv[MAXN], fac[MAXN]; int main() { #ifndef ONLINE_JUDGE freopen("input.in", "r", stdin); #endif scanf("%d%d", &n, &K); inv[0] = fac[0] = 1; for (int i = 1; i <= K; ++i) fac[i] = 1LL * fac[i-1] * i % P; inv[K] = fpow(fac[K], P-2); for (int i = K; i; --i) inv[i-1] = 1LL * i * inv[i] % P; for (int i = 0; i <= K; ++i) { f[i] = (i & 1)? P-inv[i]: inv[i]; g[i] = 1LL * fpow(i, K) * inv[i] % P; } int Lim = 1, L = 0; while (Lim <= 2*K) Lim <<= 1, ++L; Poly::init(Lim, L), Poly::NTT(f, Lim, 1), Poly::NTT(g, Lim, 1); for (int i = 0; i < Lim; ++i) f[i] = 1LL * f[i] * g[i] % P; Poly::NTT(f, Lim, -1); int ans = 0, b = 1LL * (n-1) * (n-2) / 2 % (P-1); int inv2 = fpow(2, P-2), mul = 1, pow2 = fpow(2, n-1); for (int i = 0; i < n && i <= K; ++i) { ans = (ans + 1LL * f[i] * mul % P * pow2 % P) % P; mul = 1LL * mul * (n-i-1) % P, pow2 = 1LL * pow2 * inv2 % P; } printf("%lld\n", 1LL * ans * fpow(2, b) % P * n % P); return 0; }
|