結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-20 11:00:05 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2,266 ms / 4,000 ms |
コード長 | 1,541 bytes |
コンパイル時間 | 818 ms |
コンパイル使用メモリ | 75,960 KB |
実行使用メモリ | 13,208 KB |
最終ジャッジ日時 | 2025-08-20 11:00:36 |
合計ジャッジ時間 | 28,870 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
#include <iostream> #include <algorithm> #include <cmath> using namespace std; using LL = long long; const LL kMaxN = 2e5 + 5, kMod = 998244353; struct { LL n, m, id; } a[kMaxN]; LL ans[kMaxN], f[kMaxN], inv[kMaxN], q, len, res; LL ksm(LL a, LL b) { LL res = 1; for (; b; b /= 2) { b % 2 && (res = res * a % kMod); a = a * a % kMod; } return res; } void init() { f[0] = inv[0] = 1; for (LL i = 1; i <= 2e5; i++) { inv[i] = ksm(f[i] = f[i - 1] * i % kMod, kMod - 2); } } LL C(LL n, LL m) { if (n < m) { return 0; } return f[n] * inv[m] % kMod * inv[n - m] % kMod; } void addn(LL n, LL m) { res = ((res * 2 - C(n - 1, m)) % kMod + kMod) % kMod; } void deln(LL n, LL m) { res = (res + C(n - 1, m)) % kMod * inv[2] % kMod; } void addm(LL n, LL m) { res = (res + C(n, m)) % kMod; } void delm(LL n, LL m) { res = ((res - C(n, m)) % kMod + kMod) % kMod; } int main() { init(); cin >> q; len = pow(q, 2.0 / 3.0); for (LL i = 1; i <= q; i++) { cin >> a[i].n >> a[i].m; a[i].n--, a[i].m--; a[i].id = i; } sort(a + 1, a + q + 1, [](auto a, auto b) { return a.n / len != b.n / len ? a.n < b.n : a.m < b.m; }); res = 1; for (LL i = 1, n = 0, m = 0; i <= q; i++) { for (; n > a[i].n; deln(n--, m)) { } for (; m > a[i].m; delm(n, m--)) { } for (; m < a[i].m; addm(n, ++m)) { } for (; n < a[i].n; addn(++n, m)) { } ans[a[i].id] = res * (ksm(2, n + 1) - 1) % kMod; } for (LL i = 1; i <= q; i++) { cout << ans[i] << '\n'; } return 0; }