#include using namespace std; using ll=long long; #include using mint=atcoder::modint998244353; struct FPS:vector{ using vector::vector; static constexpr ll mod=998244353; static FPS NTT(FPS &a,bool inverse=false){ const mint pr=3; int n=a.size(); int log=0; while (n>1<>k)&1)<<(log-k-1); ret[rev]=a[i]; } for (int k=1;k<=log;k++){ int len=1<>k); if (inverse) zeta=zeta.inv(); mint x=1; for (int i=0;i=deg) return FPS(deg); for (int i=shift;i=shift;i--) ret[i]=ret[i-shift]*a; for (int i=0;i>n>>m; vector v(n); for (int i=0;i>v[i]; auto func=[&](vector a){ int n=a.size(); queue> q; for (int i=0;i1){ auto f=q.front();q.pop(); auto g=q.front();q.pop(); fps h1=f.first*g.second+f.second*g.first,h2=f.second*g.second; q.push({h1,h2}); } auto [f,g]=q.front(); return (f*g.inv(m+1)).pre(m+1); }; auto g=func(v); vector f(m+1); for (int i=1;i<=m;i++){ f[i]=fps(m/i+1); mint s=g[i]; for (int j=1;j<=m/i;j++){ f[i][j]=s; s*=g[i]; } } vector> d(m+1); for (int i=2;i<=m;i++) for (int j=i;j<=m;j+=i) d[j].push_back(i); vector len(m+1,0); auto rec=[&](auto rec,int x,ll pw)-> void { assert(pw<=m); if (len[pw]>=x) return; if (x==1){ len[pw]=1; return; } for (int i=2;pw*i<=m;i++) rec(rec,x/i,pw*i); for (int i=len[pw]+1;i<=x;i++){ for (int j:d[i]){ f[pw][i]-=f[pw*j][i/j]; } } len[pw]=x; return; }; rec(rec,m,1); for (int i=1;i<=m;i++) cout<