結果
| 問題 | No.2206 Popcount Sum 2 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-08-05 11:29:57 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 538 ms / 4,000 ms |
| コード長 | 1,843 bytes |
| 記録 | |
| コンパイル時間 | 1,125 ms |
| コンパイル使用メモリ | 100,952 KB |
| 実行使用メモリ | 19,164 KB |
| 最終ジャッジ日時 | 2025-08-05 11:30:07 |
| 合計ジャッジ時間 | 9,937 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
// STOOOOOOOOOOOOOOOOOOOOOOOOO hzt CCCCCCCCCCCCCCCCCCCCCCCORZ
#include <algorithm>
#include <cassert>
#include <cmath>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
using LL = long long;
#define int LL
using PII = pair<int, int>;
constexpr int kN = 2e5 + 1, kP = 998244353;
constexpr int inv2 = (kP + 1) / 2;
int T, n, m;
int fac[kN] = {1, 1}, inv[kN] = {0, 1}, ifc[kN] = {1, 1};
int pw2[kN] = {1, 2};
int C(int n, int x) { return 1ll * fac[n] * ifc[x] % kP * ifc[n - x] % kP; }
int bel[kN], ans[kN];
struct Query {
int n, k, Tc;
inline bool operator<(Query q) {
if (bel[n] != bel[q.n])
return n < q.n;
return bel[n] & 1 ? k < q.k : k > q.k;
}
};
vector<Query> que;
signed main() {
#ifndef ONLINE_JUDGE
freopen("input.in", "r", stdin);
freopen("output.out", "w", stdout);
#endif
cin.tie(0)->sync_with_stdio(0);
for (int i = 2; i < kN; i++) {
fac[i] = 1ll * fac[i - 1] * i % kP;
inv[i] = 1ll * (kP - kP / i) * inv[kP % i] % kP;
ifc[i] = 1ll * ifc[i - 1] * inv[i] % kP;
pw2[i] = 2 * pw2[i - 1] % kP;
}
for (int i = 0; i < kN; i++)
bel[i] = (i + 1) / 430 + 1;
cin >> T;
int mx = 0;
for (int Tc = 1; Tc <= T; Tc++) {
cin >> n >> m;
if (m == 1)
ans[Tc] = pw2[n] - 1;
else
que.push_back({n - 1, m - 1, Tc});
mx = max(mx, n);
}
sort(que.begin(), que.end());
int n = 1, k = 1, cur = 2;
for (auto [tn, tk, Tc] : que) {
for (; n < tn; n++, cur = (2ll * cur - C(n - 1, k) + kP) % kP);
for (; k < tk; k++, cur = (cur + C(n, k)) % kP);
for (; k > tk; cur = (cur - C(n, k) + kP) % kP, k--);
for (; n > tn; n--, cur = 1ll * (cur + C(n, k)) * inv2 % kP);
assert(n == tn && k == tk);
ans[Tc] = (pw2[n + 1] - 1ll) * cur % kP;
}
for (int Tc = 1; Tc <= T; Tc++)
cout << ans[Tc] << '\n';
return 0;
}
vjudge1