結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-13 18:12:08 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 840 ms / 4,000 ms |
コード長 | 1,548 bytes |
コンパイル時間 | 1,680 ms |
コンパイル使用メモリ | 166,012 KB |
実行使用メモリ | 14,516 KB |
最終ジャッジ日時 | 2025-08-13 18:12:20 |
合計ジャッジ時間 | 11,993 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
#include <bits/stdc++.h> #define ll long long using namespace std; const ll kM = 2e5 + 5, mod = 998244353; ll q, i, j, qt[kM], inv[kM], f[kM], len, p[kM]; ll qpow(ll a, ll b){ ll ret = 1; while(b){ if(b & 1) ret = ret * a % mod; a = a * a % mod, b >>= 1; } return ret; } struct M{ ll m, n, id; }c[kM]; ll C(ll n, ll m){ return f[n] * inv[m] % mod * inv[n - m] % mod; } ll wp(ll x){ return (x + len - 1) / len; } ll cmp(M a, M b){ if(wp(a.m) == wp(b.m)) return a.n < b.n; return a.m < b.m; } int main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> q; for(i = f[0] = p[0] = 1; i <= kM - 2; i++){ f[i] = f[i - 1] * i % mod; p[i] = p[i - 1] * 2 % mod; } inv[kM - 2] = qpow(f[kM - 2], mod - 2); for(i = kM - 3; ~i; i--){ inv[i] = inv[i + 1] * (i + 1) % mod; } len = 1.01 * sqrt(kM - 2) + 1; for(i = 1; i <= q; i++){ cin >> c[i].n >> c[i].m; c[i].id = i; } sort(c + 1, c + q + 1, cmp); ll cnt = 0, tmp = 0, l = 1, r = 0; for(i = 1; i <= q; i++){ ll m = c[i].m, n = c[i].n; if(wp(m) != wp(c[i - 1].m)){ cnt = p[n] - 1, tmp = 0; for(j = 0; j < m; j++){ tmp = (tmp + C(n - 1, j)) % mod; } l = m, r = n; } while(r < n) ++r, tmp = (tmp * 2 - C(r - 2, l - 1) + mod) % mod; while(l < m) l++, tmp = (tmp + C(r - 1, l - 1)) % mod; while(l > m) tmp = (tmp - C(r - 1, l - 1) + mod) % mod, l--; cnt = p[n] - 1; qt[c[i].id] = tmp * cnt % mod; } for(i = 1; i <= q; i++){ cout << qt[i] << "\n"; } return 0; }