結果
| 問題 | No.2206 Popcount Sum 2 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-06-04 16:35:47 |
| 言語 | C++23(gnu拡張) (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,965 bytes |
| 記録 | |
| コンパイル時間 | 3,902 ms |
| コンパイル使用メモリ | 339,132 KB |
| 実行使用メモリ | 14,720 KB |
| 最終ジャッジ日時 | 2026-06-04 16:36:21 |
| 合計ジャッジ時間 | 33,602 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | WA * 18 |
ソースコード
#include <bits/stdc++.h>
#define int long long int
using namespace std;
const int MAXN = 2e5 + 5, mod = 998244353;
int T, inv[MAXN], jc[MAXN], n, m, id[MAXN], ans[MAXN], last = 1, l, r, inv_2;
struct Node {
int x, y, pos;
}ls[MAXN];
int KSM(int a, int b) {
int sum = 1;
while (b) {
if (b & 1) sum *= a, sum %= mod;
a *= a, a %= mod;
b >>= 1;
}
return sum;
}
void ycl() {
jc[0] = inv[0] = 1;
for (int i = 1; i <= MAXN - 5; i++) jc[i] = jc[i - 1] * i % mod, inv[i] = KSM(jc[i], mod - 2);
}
int C(int a, int b) {
return jc[a] * inv[b] % mod * inv[a - b] % mod;
}
void MKFK() {
int kc = cbrt(MAXN);
for (int i = 0; i <= MAXN - 5; i++) id[i] = (i - 1) / kc + 1;
}
bool cmp(Node x, Node y) {
if (id[x.x] != id[y.x]) return id[x.x] < id[y.x];
return x.y < y.y;
}
void add(int x, int op) {
// if (op) cout << l << ' ' << r << ';';
if (op == 0) last = (last * 2 % mod - C(l, r) + mod) % mod;
else last = (last + C(l, r + 1)) % mod;
}
void del(int x, int op) {
if (op == 0) last = ((last + C(l, r)) % mod * inv_2) % mod;
else last = (last - C(l, r) + mod) % mod;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0);
ycl();
inv_2 = KSM(2, mod - 2);
cin >> T;
for (int i = 1; i <= T; i++) {
cin >> ls[i].x >> ls[i].y;
ls[i].x --, ls[i].y --;
ls[i].pos = i;
}
MKFK();
sort(ls + 1, ls + 1 + T, cmp);
for (int i = 1; i <= T; i++) {
while (l < ls[i].x) add(l, 0), l++;
// cout << last << ' ';
while (l > ls[i].x) del(l, 0), l--;
// l = ls[i].x;
while (r < ls[i].y) add(r, 1), r++;
while (r > ls[i].y) del(r, 1), r--;
ans[ls[i].pos] = (KSM(2, ls[i].x + 1) - 1) * last % mod;
}
for (int i = 1; i <= T; i++) {
cout << ans[i] << '\n';
}
return 0;
}
/*
C(n, 0) + C(n, 1) + C(n, 2) + C(n, 3) + ... + C(n, m)
C(n + 1, 0) + C(n + 1, 1) + C(n + 1, 2) + C(n + 1, 3) + ... + C(n + 1, m)
= C(n, 0) + (C(n, 0) + C(n, 1)) + (C(n, 1) + C(n, 2)) + ... + (C(n, m - 1) + C(n, m))
= 2 * last - C(n, m)
1
4 3
C(4, 0) + C(4, 1)
*/
vjudge1