結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-02 16:29:04 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 611 ms / 4,000 ms |
コード長 | 1,342 bytes |
コンパイル時間 | 1,864 ms |
コンパイル使用メモリ | 167,900 KB |
実行使用メモリ | 14,624 KB |
最終ジャッジ日時 | 2025-08-02 16:29:15 |
合計ジャッジ時間 | 10,354 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define int long long #define MAXN 200005 #define bl(x) (((x)-1)/B+1) const int MOD(998244353); const int inv2(499122177); int t, B; int fac[MAXN], ifac[MAXN], pw[MAXN], ans[MAXN]; struct Que{int l, r, id;}que[MAXN]; int qpow(int x, int k=MOD-2){int res(1); for (; k; k>>=1, (x*=x)%=MOD) if (k&1) (res*=x)%=MOD; return res;} int C(int n, int m){return n >= m && m >= 0 ? fac[n]*ifac[m]%MOD*ifac[n-m]%MOD : 0;} signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); fac[0] = ifac[0] = pw[0] = 1; for (int i(1); i<MAXN; ++i) pw[i] = (pw[i-1]*2)%MOD, ifac[i] = qpow(fac[i]=i*fac[i-1]%MOD); cin >> t; for (int i(1); i<=t; ++i) cin >> que[i].r >> que[i].l, ans[que[i].id=i] = (pw[que[i].r]-1+MOD)%MOD, --que[i].l, --que[i].r; B = MAXN/sqrt(t); sort(que+1, que+t+1, [](Que a, Que b){return bl(a.l) == bl(b.l) ? (bl(a.l) & 1 ? a.r < b.r : a.r > b.r) : bl(a.l) < bl(b.l);}); for (int i(1), l(0), r(0), res(1); i<=t; ++i){ while (l > que[i].l) (res += MOD-C(r, l--)) %= MOD; while (r < que[i].r) (res += res+MOD-C(r++, l)) %= MOD; while (l < que[i].l) (res += C(r, ++l)) %= MOD; while (r > que[i].r) res = (res+C(--r, l))*inv2%MOD; (ans[que[i].id] *= res) %= MOD; } for (int i(1); i<=t; ++i) cout << ans[i] << '\n'; return 0; }