結果
| 問題 | No.2206 Popcount Sum 2 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-08-05 09:18:22 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 972 ms / 4,000 ms |
| コード長 | 1,543 bytes |
| 記録 | |
| コンパイル時間 | 1,663 ms |
| コンパイル使用メモリ | 169,224 KB |
| 実行使用メモリ | 13,052 KB |
| 最終ジャッジ日時 | 2025-08-05 09:18:36 |
| 合計ジャッジ時間 | 13,442 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include <bits/stdc++.h>
#define int long long
using namespace std;
using Pii = pair<int, int>;
const int N = 2e5 + 5, M = 500, P = 998244353;
struct Q {
int l, r, id;
} w[N];
int q, f[N], I[N], l, r, d = 1, e[N];
int C(int x, int y) {
return f[x] * I[y] % P * I[x - y] % P;
}
void A(int x, int v) {
if (v) {
d = (d * 2 - C(x - 1, l) + P) % P;
} else {
d = (d + C(r, x)) % P;
}
}
void D(int x, int v) {
if (v) {
d = ((P + 1) / 2 * (d + C(x, l + 1) - C(x - 1, l + 1) + P)) % P;
} else {
d = (d - C(r, x) + P) % P;
}
}
int Qp(int x, int y, int P = ::P) {
if (!y) {
return 1;
}
int z = Qp(x, y / 2, P);
return z * z % P * (y & 1 ? x : 1) % P;
}
signed main() {
cin.tie(0)->ios::sync_with_stdio(0);
cin >> q;
for (int i = 1; i <= q; i++) {
cin >> w[i].r >> w[i].l;
w[i].l--;
w[i].r--;
w[i].id = i;
}
for (int i = f[0] = I[0] = I[1] = 1; i < N; i++) {
f[i] = f[i - 1] * i % P;
if (i > 1) {
I[i] = I[P % i] * (-P / i + P) % P;
}
}
for (int i = 1; i < N; i++) {
I[i] = I[i] * I[i - 1] % P;
}
sort(w + 1, w + q + 1, [](Q x, Q y) { return (x.l / M) != (y.l / M) ? (x.l / M < y.l / M) : x.r < y.r; });
for (int i = 1; i <= q; i++) {
for (; l > w[i].l; D(l--, 0)) {
}
for (; r < w[i].r; A(++r, 1)) {
}
for (; r > w[i].r; D(r--, 1)) {
}
for (; l < w[i].l; A(++l, 0)) {
}
e[w[i].id] = d * (Qp(2, w[i].r + 1) + P - 1) % P;
}
for (int i = 1; i <= q; i++) {
cout << e[i] << '\n';
}
return 0;
}
/*
*/
vjudge1