結果
問題 |
No.2952 Invision of Multiples
|
ユーザー |
![]() |
提出日時 | 2025-09-18 17:55:23 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,782 ms / 4,000 ms |
コード長 | 1,904 bytes |
コンパイル時間 | 1,233 ms |
コンパイル使用メモリ | 121,740 KB |
実行使用メモリ | 16,916 KB |
最終ジャッジ日時 | 2025-09-18 17:56:18 |
合計ジャッジ時間 | 50,202 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 41 |
ソースコード
#include <iostream> #include <atcoder/modint> #include <atcoder/math> #include <atcoder/segtree> 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<MX;i++){ inv[i] = mod - (mod/i)*inv[mod%i]; } f[0] = fi[0] = 1; for(int i=1;i<MX;i++){ f[i] = f[i-1]*i; fi[i] = fi[i-1]*inv[i]; } } mint nck(ll n, ll k){ if(n<0 || k<0 || n<k) return 0; return f[n]*fi[k]*fi[n-k]; } mint pw(mint a,ll x){ mint ret = 1; while(x){ if(x&1) (ret *= a); (a *= a); x /= 2; } return ret; } mint op(mint a,mint b){return a + b;} mint e(){return 0;} const int B = 200; ll N[50010],d[50010],cnt[50010]; int main(){ solve(); ll i,j,n,m; cin >> n >> m; for(i=0;i<n;i++) cin >> d[i]; for(i=0;i<n;i++) N[i] = m/d[i]; mint ans = 0; // (?,小) for(i=n - 1;i>=0;i--){ for(j=1;j<=B;j++){ ans += inv[N[i]]*inv[m/j]*cnt[j]*floor_sum(N[i],j,d[i],d[i] - 1); } cnt[d[i]]++; } // debug mint ans1 = ans; for(i=0;i<n;i++) ans1 *= N[i]; // (小,大) for(j=1;j<=m;j++) cnt[j] = 0; for(i=0;i<n;i++){ if(d[i]>B){ for(j=1;j<=B;j++){ ans += inv[N[i]]*inv[m/j]*cnt[j]*(m/j*N[i] - floor_sum(N[i],j,d[i],d[i])); } } cnt[d[i]]++; } // (大,大) segtree<mint,op,e> 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<n;i++) ans *= N[i]; cout << ans.val() << "\n"; }