結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-05 17:08:06 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 604 ms / 4,000 ms |
コード長 | 1,835 bytes |
コンパイル時間 | 2,947 ms |
コンパイル使用メモリ | 284,752 KB |
実行使用メモリ | 13,008 KB |
最終ジャッジ日時 | 2025-08-05 17:08:20 |
合計ジャッジ時間 | 12,208 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
#include <bits/stdc++.h> #define ll long long #define inf 2147483647 //9223372036854775807 #define mod 998244353 using namespace std; inline ll rd() { ll x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') x = x * 10 + ch - 48, ch = getchar(); return x * f; } struct Node { ll l, r, ans, id; } q[200005]; ll n, sq, fac[200005] = {1}, inv[200005], a[3]; ll pw(ll x, ll y) { ll res = 1; for(; y; y >>= 1, x = x * x % mod) if(y & 1) res = res * x % mod; return res; } ll C(ll x, ll y) { if(x < y) return 0; return fac[x] * inv[y] % mod * inv[x - y] % mod; } ll A(ll x, ll y) { if(x < y) return 0; return fac[x] * inv[x - y] % mod; } bool cmp(Node x, Node y) { if(x.l / sq != y.l / sq) return x.l / sq < y.l / sq; if(x.l / sq & 1) return x.r > y.r; return x.r < y.r; } signed main() { // freopen(".in", "r", stdin); // freopen(".out", "w", stdout); n = rd(), sq = sqrt(n); for(ll i = 1; i <= n; i++) q[i].l = rd() - 1, q[i].r = rd() - 1, q[i].id = i; for(ll i = 1; i <= 200000; i++) fac[i] = fac[i - 1] * i % mod; inv[200000] = pw(fac[200000], mod - 2); for(ll i = 199999; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod; sort(q + 1, q + n + 1, cmp); ll l = 0, r = -1, res = 0; for(ll i = 1; i <= n; i++) { while(l > q[i].l) res = (res + C(--l, r)) % mod * 499122177 % mod; while(r < q[i].r) res = (res + C(l, ++r)) % mod; while(l < q[i].l) res = (2 * res - C(l++, r) + mod) % mod; while(r > q[i].r) res = (res - C(l, r--) + mod) % mod; q[i].ans = res * (pw(2, q[i].l + 1) - 1 + mod) % mod; } sort(q + 1, q + n + 1, [](Node x, Node y) { return x.id < y.id; }); for(ll i = 1; i <= n; i++) cout << q[i].ans << '\n'; return 0; } /* */