#include #include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; const int MX = 1000010; mint f[MX],inv[MX],fi[MX]; constexpr ll mod = 998244353; void solve(){ inv[1] = 1; for(int i=2;i> n >> m; for(i=0;i> d[i]; for(i=1;i<=m;i++) di[i] = m/i; for(i=0;i=0;i--){ for(j=1;j<=B;j++){ ans += inv[N[i]]*inv[di[j]]*cnt[j]*floor_sum(N[i],j,d[i],d[i] - 1); } cnt[d[i]]++; } // debug mint ans1 = ans; for(i=0;iB){ for(j=1;j<=B;j++){ ans += inv[N[i]]*inv[di[j]]*cnt[j]*(m/j*N[i] - floor_sum(N[i],j,d[i],d[i])); } } cnt[d[i]]++; } // (大,大) segtree seg(m + 1); auto upd = [&](int pos,mint val){ seg.set(pos,seg.get(pos) + val); }; for(i=n - 1;i>=0;i--){ if(d[i]<=B) continue; for(j=d[i];j<=m;j+=d[i]){ ans += seg.prod(0,j)*inv[N[i]]; } for(j=d[i];j<=m;j+=d[i]) upd(j,inv[N[i]]); } for(i=0;i