#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include #define rep(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++) using namespace atcoder; using namespace std; typedef long long ll; using mint = modint998244353; struct Comb { vector fact, ifact; int MAX_COM; Comb() {} Comb(int n, int mod) { MAX_COM = n; init(mod, MAX_COM); } void init(long long MOD, long long MAX_COM) { int n = MAX_COM; assert(n < MOD); fact = vector(n + 1); ifact = vector(n + 1); fact[0] = 1; for (int i = 1; i <= n; ++i) fact[i] = fact[i - 1] * i; ifact[n] = fact[n].inv(); for (int i = n; i >= 1; --i) ifact[i - 1] = ifact[i] * i; } mint operator()(long long n, long long k) { if (k < 0 || k > n) return 0; return fact[n] * ifact[k] * ifact[n - k]; } }; Comb comb(5000010, 998244353); vector binomial_transform(vector f) { // ans[i] = Σ (j=0 to i) f[j] * comb(i, j) int n = f.size(); vector fact(n), invfact(n); fact[0] = 1; for (int i = 1; i < n; i++) fact[i] = fact[i - 1] * i; invfact[n - 1] = fact[n - 1].inv(); for (int i = n - 1; i > 0; i--) invfact[i - 1] = invfact[i] * i; vector A(n), B(n); for (int i = 0; i < n; i++) { A[i] = f[i] * invfact[i]; B[i] = invfact[i]; } auto C = convolution(A, B); vector ans(n); for (int i = 0; i < n; i++) { ans[i] = C[i] * fact[i]; } return ans; } void solve() { int n, k; cin >> n >> k; vector fact(n); fact[0] = 1; rep(i, 1, n) fact[i] = fact[i - 1] * i; auto count_len = [&](int len) { len++; mint ret = pow_mod(n, n - len, 998244353); ret *= len; ret *= fact[n - 1]; ret /= fact[n - len]; ret /= 2; return ret; }; vector f(n); rep(i, 0, n) f[i] = count_len(i) * mint(i).pow(k) / comb(n, i + 1); auto ans = binomial_transform(f); for (auto x : ans) cout << x.val() << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); solve(); }