結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-03 21:19:20 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 878 ms / 4,000 ms |
コード長 | 1,554 bytes |
コンパイル時間 | 2,389 ms |
コンパイル使用メモリ | 200,044 KB |
実行使用メモリ | 9,260 KB |
最終ジャッジ日時 | 2025-08-03 21:19:35 |
合計ジャッジ時間 | 15,007 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:40:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 40 | scanf("%d", &q); | ~~~~~^~~~~~~~~~ main.cpp:43:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 43 | scanf("%d%d", &a[i].n, &a[i].m); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h> using namespace std; constexpr int mod = 998244353; int q, sz, fac[200005], invfac[200005], pw2[200005], ans[200005]; struct Info { int n, m, id; } a[200005]; bool cmp(const Info& l, const Info& r) { return l.n / sz < r.n / sz || (l.n / sz == r.n / sz && l.m < r.m); } int qpow(int a, int n) { int res = 1; while (n) { if (n & 1) res = 1ll * res * a % mod; a = 1ll * a * a % mod; n >>= 1; } return res; } int C(int n, int m) { if (n < m || m < 0) return 0; return 1ll * fac[n] * invfac[n - m] % mod * invfac[m] % mod; } int main() { fac[0] = 1; pw2[0] = 1; for (int i = 1; i <= 200000; i++) { fac[i] = 1ll * fac[i - 1] * i % mod; pw2[i] = pw2[i - 1] * 2ll % mod; } invfac[200000] = qpow(fac[200000], mod - 2); for (int i = 199999; i >= 0; --i) { invfac[i] = invfac[i + 1] * (i + 1ll) % mod; } scanf("%d", &q); sz = sqrt(q); for (int i = 1; i <= q; i++) { scanf("%d%d", &a[i].n, &a[i].m); --a[i].n, --a[i].m, a[i].id = i; } sort(a + 1, a + q + 1, cmp); int l = 0, r = 0, res = 1; for (int i = 1; i <= q; i++) { int n = a[i].n, m = a[i].m, id = a[i].id; while (l > n) { res = (res + C(l - 1, r)) % mod * 499122177ll % mod; --l; } while (l < n) { res = (res * 2ll % mod - C(l, r) + mod) % mod; ++l; } while (r < m) { res = (res + C(l, r + 1)) % mod; ++r; } while (r > m) { res = (res - C(l, r) + mod) % mod; --r; } ans[id] = (pw2[n + 1] - 1ll + mod) % mod * res % mod; } for (int i = 1; i <= q; i++) { printf("%d\n", ans[i]); } return 0; }