結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-03 22:50:15 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,852 bytes |
コンパイル時間 | 1,237 ms |
コンパイル使用メモリ | 100,972 KB |
実行使用メモリ | 11,032 KB |
最終ジャッジ日時 | 2025-08-03 22:50:24 |
合計ジャッジ時間 | 7,547 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | WA * 18 |
ソースコード
// STOOOOOOOOOOOOOOOOOOOOOOOOO hzt CCCCCCCCCCCCCCCCCCCCCCCORZ #include <algorithm> #include <cassert> #include <cmath> #include <iostream> #include <numeric> #include <vector> using namespace std; using LL = long long; 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; 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; int 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; } 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); } for (int Sq = 200, i = 1; !bel[mx - 1]; i++) fill(bel + (i - 1) * Sq, bel + min(i * Sq + 1, mx), i); 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)), k--); for (; n > tn; cur = 1ll * (cur + C(n, k)) * inv2 % kP, n--); 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; }