結果
| 問題 |
No.2206 Popcount Sum 2
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 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;
}
vjudge1