#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define repr(i, n) for (int i = (int)(n) - 1; i >= 0; i--) #define repk(i, k, n) for (int i = k; i < (int)(n); i++) #define all(v) v.begin(), v.end() #define mod1 1000000007 #define mod2 998244353 #define mod3 100000007 #define vi vector #define vs vector #define vc vector #define vl vector #define vb vector #define vvi vector> #define vvc vector> #define vvl vector> #define vvb vector> #define vvvi vector>> #define vvvl vector>> #define pii pair #define pil pair #define pli pair #define pll pair #define vpii vector> #define vpll vector> #define vvpii vector>> #define vvpll vector>> template void debug(T e) { cerr << e << endl; } template void debug(vector &v) { rep(i, v.size()) { cerr << v[i] << " "; } cerr << endl; } template void debug(vector> &v) { rep(i, v.size()) { rep(j, v[i].size()) { cerr << v[i][j] << " "; } cerr << endl; } } template void debug(vector> &v) { rep(i, v.size()) { cerr << v[i].first << " " << v[i].second << endl; } } template void debug(set &st) { for (auto itr = st.begin(); itr != st.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(multiset &ms) { for (auto itr = ms.begin(); itr != ms.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(map &mp) { for (auto itr = mp.begin(); itr != mp.end(); itr++) { cerr << itr->first << " " << itr->second << endl; } } void debug_out() { cerr << endl; } template void debug_out(Head H, Tail... T) { cerr << H << " "; debug_out(T...); } using mint = modint998244353; void debug_mint1(vector &vec) { for (int i = 0; i < vec.size(); i++) { cerr << vec[i].val() << " "; } cerr << endl; } void debug_mint2(vector> &vec) { for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < vec[i].size(); j++) { cerr << vec[i][j].val() << " "; } cerr << endl; } } ll my_pow(ll x, ll n, ll mod) { //  繰り返し二乗法.x^nをmodで割った余り. ll ret; if (n == 0) { ret = 1; } else if (n % 2 == 1) { ret = (x * my_pow((x * x) % mod, n / 2, mod)) % mod; } else { ret = my_pow((x * x) % mod, n / 2, mod); } return ret; } ll inv(ll x, ll mod) { return my_pow(x, mod - 2, mod); } vector fps_inv(vector &f) { // f の mod 998244353 での fps_inv を返す ll n = f.size(); ll new_n = 1; ll log = 0; while (new_n < n) { new_n *= 2; log++; } for (ll i = n; i < new_n; i++) { f.push_back(0); } // g[0] の項 vector g = {inv(f[0], mod2)}; ll now = 1; for (ll i = 0; i < log; i++) { now *= 2LL; vector fsub(now); for (ll j = 0; j < now; j++) { fsub[j] = f[j]; } vector h1 = convolution(g, fsub); vector h2(now, 0); h2[0] = 2; for (ll j = 0; j < now; j++) { h2[j] = (h2[j] + mod2 - h1[j]) % mod2; } vector h3 = convolution(g, h2); for (ll j = 0; j < now / 2; j++) { g[j] = h3[j]; } for (ll j = now / 2; j < now; j++) { g.push_back(h3[j]); } } vector new_g(0); for (ll i = 0; i < n; i++) { new_g.push_back(g[i]); } return new_g; } vector fps_log(vector &f){ ll n = f.size(); vector f_inv = fps_inv(f); vector f_diff(n); for (ll i = 1; i < n; i++){ f_diff[i - 1] = (f[i] * i) % mod2; } vector log_int = convolution(f_diff, f_inv); vector ret(n); for (ll i = 1; i < n; i++){ ret[i] = (log_int[i - 1] * inv(i, mod2)) % mod2; } return ret; } vector fps_exp(vector &f){ // f の mod 998244353 での fps_exp を返す ll n = f.size(); ll new_n = 1; ll log = 0; while (new_n < n) { new_n *= 2; log++; } for (ll i = n; i < new_n; i++) { f.push_back(0); } // g[0] の項 vector g = {1}; ll now = 1; for (ll i = 0; i < log; i++) { now *= 2LL; vector fsub(now); for (ll j = 0; j < now; j++) { fsub[j] = f[j]; } fsub[0] = (fsub[0] + 1) % mod2; vector ext_g(now); for (ll j = 0; j < now / 2; j++){ ext_g[j] = g[j]; } vector g_log = fps_log(ext_g); for (ll j = 0; j < now; j++){ fsub[j] = (fsub[j] + mod2 - g_log[j]) % mod2; } vector h = convolution(fsub, g); for (ll j = now / 2; j < now; j++) { g.push_back(h[j]); } } vector new_g(0); for (ll i = 0; i < n; i++) { new_g.push_back(g[i]); } return new_g; } int main() { ll N, K; cin >> N >> K; vector log_f(N + 1, 0); // 分子の計算 for (ll i = 1; i <= N; i++){ for (ll j = 1; j * i <= N; j++){ log_f[i * j] += (mint(1) / mint(j)).val(); log_f[i * j] %= mod2; } } // 分母の計算 for (ll i = K + 1; i <= N; i += (K + 1)){ for (ll j = 1; j * i <= N; j++){ log_f[i * j] += (mod2 - (mint(1) / mint(j)).val()); log_f[i * j] %= mod2; } } vector Ans = fps_exp(log_f); for (ll i = 1; i <= N; i++){ cout << Ans[i] << " "; } cout << endl; }