#include #include using namespace std; using namespace atcoder; typedef modint998244353 mint; typedef long long ll; //defmodfact const int COMinitMAX = 1234567; mint fact[COMinitMAX+1], factinv[COMinitMAX+1]; void modfact(){ fact[0] = 1; for (int i=1; i<=COMinitMAX; i++){ fact[i] = fact[i-1] * i; } factinv[COMinitMAX] = fact[COMinitMAX].inv(); for (int i=COMinitMAX-1; i>=0; i--){ factinv[i] = factinv[i+1] * (i+1); } } mint cmb(int a, int b){ if (a poly_inv(vector &a, int M = -314159265){ if (M == -314159265) M = (int)a.size(); else if (M <= 0) return {}; int n = a.size(); mint r = a[0].pow((ll)mint::mod-2); int m = 1; vector res = {r}; while (m < M){ vector f = a; f.resize(2 * m); vector g = res; g.resize(2 * m); internal::butterfly(f); internal::butterfly(g); for (int i=0; i<2*m; i++){ f[i] = f[i] * g[i]; } internal::butterfly_inv(f); for (int i=0; i poly_log(vector &a, int M = -314159265){ if (M == -314159265) M = (int)a.size(); else if (M <= 0) return {}; int n = a.size(); if (n == 1) return vector(M, 0); vector b(n-1); for (int i=0; i t = convolution(b, poly_inv(a, M)); vector ret(M); for (int i=0; i> n >> m; queue> pq; for (int i=0; i> r; pq.push({1, mint(-r)}); } while (pq.size() > 1){ vector x = pq.front(); pq.pop(); vector y = pq.front(); pq.pop(); pq.push(convolution(x,y)); } vector f = pq.front(); vector g = poly_log(f, m+1); vector ans(m); for (int i=0; i<(int)ans.size(); i++){ ans[i] = - g[i+1] * (i+1); } for (int i=0; i