Advertisement
pb_jiang

CF1879D

Mar 24th, 2025
693
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.25 KB | None | 0 0
  1. // Problem: D. Sum of XOR Functions
  2. // Contest: Codeforces - Educational Codeforces Round 155 (Rated for Div. 2)
  3. // URL: https://codeforces.com/problemset/problem/1879/D
  4. // Memory Limit: 256 MB
  5. // Time Limit: 2000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8.  
  9. #include <assert.h>
  10. #include <bits/stdc++.h>
  11. using namespace std;
  12. #ifndef __DEBUG__
  13. #define dbg(...) 42
  14. #endif
  15. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  16.  
  17. using ll = long long;
  18. using a2l = array<ll, 2>;
  19. using pll = pair<ll, ll>;
  20. using vl = vector<ll>;
  21.  
  22. constexpr ll mod = 998244353;
  23.  
  24. void solve_edt()
  25. {
  26.     ll n, ans = 0;
  27.     cin >> n;
  28.     vl a(n);
  29.     for (auto &x : a)
  30.         cin >> x;
  31.  
  32.     /*
  33.     for (ll i = 1; i < n; ++i)
  34.         a[i] ^= a[i - 1];
  35.     */
  36.  
  37.     auto count_bit = [&](ll b) {
  38.         ll ret = 0;
  39.         ll sum[2] = {0, 0}, cnt[2] = {1, 0};
  40.         for (ll i = 0, acc = 0; i < n; ++i) {
  41.             ll v = a[i] >> b & 1;
  42.             // ll flag = acc % 2;
  43.             ll pf = acc % 2;
  44.             acc = acc + v;
  45.             ll flag = acc % 2;
  46.             // ll d = (i + 1) * (cnt[1 - flag] + v) - sum[1 - flag];
  47.             ll d = (i + 1) * cnt[1 - flag] - sum[1 - flag];
  48.             dbg(flag, v, d);
  49.             dbg(i + 1, cnt[1 - flag], sum[1 - flag]);
  50.             // sum[flag] += i + 1, cnt[flag] += 1;
  51.             sum[flag] += i + 1, cnt[flag] += 1;
  52.             // sum[pf] += i, cnt[pf] += 1;
  53.             dbg(d);
  54.             ret = (ret + d) % mod;
  55.         }
  56.         return (ret << b) % mod;
  57.     };
  58.  
  59.     for (ll i = 0; i < 31; ++i)
  60.         ans = (ans + count_bit(i)) % mod;
  61.     cout << ans << '\n';
  62. }
  63.  
  64. void solve()
  65. {
  66.     ll n, ans = 0;
  67.     cin >> n;
  68.     vl a(n);
  69.     for (auto &x : a)
  70.         cin >> x;
  71.  
  72.     auto count_bit = [&](ll b) {
  73.         ll ret = 0;
  74.         vl acc(n), oc(n), ec(n), os(n), es(n);
  75.         for (ll i = 0; i < n; ++i) {
  76.             ll c = (a[i] >> b) & 1;
  77.             acc[i] = c + (i > 0 ? acc[i - 1] : 0);
  78.         }
  79.         for (ll i = n - 1; i >= 0; --i) {
  80.             ll v = acc[i] % 2;
  81.             oc[i] = (i < n - 1 ? oc[i + 1] : 0) + v;
  82.             ec[i] = (i < n - 1 ? ec[i + 1] : 0) + 1 - v;
  83.             os[i] = (i < n - 1 ? os[i + 1] : 0) + (v ? i : 0);
  84.             es[i] = (i < n - 1 ? es[i + 1] : 0) + (1 - v ? i : 0);
  85.         }
  86.         for (ll i = 0, zc = 0; i < n; ++i) {
  87.             ll flag = (a[i] >> b) & 1;
  88.             zc += 1;
  89.             if (flag) {
  90.                 const auto &vs = acc[i] % 2 ? os : es;
  91.                 const auto &cs = acc[i] % 2 ? oc : ec;
  92.                 auto v = vs[i] + cs[i];
  93.                 auto d = (v * zc - cs[i] * zc * (i + i - zc + 1) / 2) % mod;
  94.                 dbg(d, v, zc);
  95.                 ret = (ret + d) % mod;
  96.                 zc = 0;
  97.             }
  98.         }
  99.         return (ret << b) % mod;
  100.     };
  101.     for (ll i = 0; i < 31; ++i)
  102.         ans = (ans + count_bit(i)) % mod;
  103.     cout << ans << '\n';
  104. }
  105.  
  106. void solve_wa()
  107. {
  108.     ll n, ans = 0;
  109.     cin >> n;
  110.     vl a(n);
  111.     for (auto &x : a)
  112.         cin >> x;
  113.  
  114.     auto count_bit = [&](ll b) {
  115.         ll ret = 0;
  116.         vl acc(n), oc(n), ec(n);
  117.         for (ll i = 0; i < n; ++i) {
  118.             ll c = (a[i] >> b) & 1;
  119.             acc[i] = c + (i > 0 ? acc[i - 1] : 0);
  120.         }
  121.         for (ll i = n - 1; i >= 0; --i) {
  122.             ll v = acc[i] % 2;
  123.             oc[i] = (i < n - 1 ? oc[i + 1] : 0) + v;
  124.             ec[i] = (i < n - 1 ? ec[i + 1] : 0) + 1 - v;
  125.         }
  126.         for (ll i = 0, zc = 0; i < n; ++i) {
  127.             ll flag = (a[i] >> b) & 1;
  128.             zc += 1;
  129.             if (flag) {
  130.                 const auto &vs = acc[i] % 2 ? oc : ec;
  131.                 auto v = vs[i];
  132.                 auto gain = v * (v + 1) / 2;
  133.                 auto gain2 = (gain + gain + v * (zc - 1)) * zc / 2;
  134.                 if (b == 1)
  135.                     dbg(gain2);
  136.                 ret = (ret + gain2) % mod;
  137.                 zc = 0;
  138.             }
  139.         }
  140.         if (b == 1) {
  141.             dbg(acc);
  142.             dbg(ec);
  143.             dbg(oc);
  144.         }
  145.         return (ret << b) % mod;
  146.     };
  147.     for (ll i = 0; i < 31; ++i)
  148.         ans = (ans + count_bit(i)) % mod;
  149.     cout << ans << '\n';
  150. }
  151.  
  152. int main(int argc, char **argv)
  153. {
  154.     solve_edt();
  155.     return 0;
  156. };
  157.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement