結果
問題 | No.2206 Popcount Sum 2 |
ユーザー | shobonvip |
提出日時 | 2023-02-03 23:10:49 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 561 ms / 4,000 ms |
コード長 | 1,869 bytes |
コンパイル時間 | 4,555 ms |
コンパイル使用メモリ | 272,400 KB |
実行使用メモリ | 9,600 KB |
最終ジャッジ日時 | 2024-07-02 21:15:20 |
合計ジャッジ時間 | 12,696 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 5 ms
5,760 KB |
testcase_01 | AC | 6 ms
5,888 KB |
testcase_02 | AC | 107 ms
5,888 KB |
testcase_03 | AC | 115 ms
5,760 KB |
testcase_04 | AC | 112 ms
6,016 KB |
testcase_05 | AC | 560 ms
9,216 KB |
testcase_06 | AC | 561 ms
9,344 KB |
testcase_07 | AC | 561 ms
9,472 KB |
testcase_08 | AC | 559 ms
9,600 KB |
testcase_09 | AC | 561 ms
9,344 KB |
testcase_10 | AC | 294 ms
9,216 KB |
testcase_11 | AC | 292 ms
9,412 KB |
testcase_12 | AC | 294 ms
9,344 KB |
testcase_13 | AC | 259 ms
9,344 KB |
testcase_14 | AC | 260 ms
9,216 KB |
testcase_15 | AC | 258 ms
9,344 KB |
testcase_16 | AC | 327 ms
9,472 KB |
testcase_17 | AC | 329 ms
9,472 KB |
testcase_18 | AC | 327 ms
9,344 KB |
ソースコード
#include<bits/stdc++.h> #include<atcoder/all> using namespace std; using namespace atcoder; typedef modint998244353 mint; typedef long long ll; struct t3 { int left, right, index; }; bool sec_sort(t3 a, t3 b) { return a.right < b.right; } //defmodfact const int COMinitMAX = 300000; mint fact[COMinitMAX+1], factinv[COMinitMAX+1]; void modfact(){ fact[0] = 1; for (int i=1; i<=COMinitMAX; i++){ fact[i] = fact[i-1] * i; } factinv[COMinitMAX] = fact[COMinitMAX].inv(); for (int i=COMinitMAX-1; i>=0; i--){ factinv[i] = factinv[i+1] * (i+1); } } mint cmb(int a, int b){ if (a<b || b<0) return mint(0); return fact[a]*factinv[b]*factinv[a-b]; } //-------- int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); modfact(); int sep = ceil(sqrt(200005)); vector<vector<t3>> mo(sep+1, vector<t3>(0)); int t; cin >> t; int n, m; t3 f; for(int i=0; i<t; i++) { cin >> n >> m; f.left = n-1; f.right = m-1; f.index = i; mo[(n-1)/sep].push_back(f); } int l = 0; int r = 0; int tl, tr; tl = 0; tr = 0; mint nowans = 1; vector<mint> ans(t); mint inv2 = mint(2).inv(); for(int i=0; i<sep+1; i++) { sort(mo[i].begin(), mo[i].end(), sec_sort); for(int j=0; j<mo[i].size(); j++) { tl = mo[i][j].left; tr = mo[i][j].right; for(int k=r-1; k>=tr; k--) { nowans -= cmb(l, k+1); } r = min(r, tr); for(int k=l; k<tl; k++) { if (r >= 1) nowans = nowans * 2 - cmb(k, r); else nowans = nowans; } for(int k=l-1; k>=tl; k--) { if (r >= 1) nowans = (nowans + cmb(k, r)) * inv2; else nowans = nowans; } l = tl; for(int k=r; k<tr; k++) { nowans += cmb(l, k+1); } r = tr; //cout << nowans.val() << endl; ans[mo[i][j].index] = nowans * (mint(2).pow(mo[i][j].left + 1) - 1); } } for(int i=0; i<t; i++) { cout << ans[i].val() << "\n"; } }