Advertisement
pb_jiang

CF1879D

Mar 20th, 2025
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.06 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.             acc = acc + v;
  44.             ll flag = acc % 2;
  45.             ll d = (i + 1) * cnt[1 - flag] - sum[1 - flag];
  46.             dbg(flag, v, d);
  47.             dbg(i + 1, cnt[1 - flag], sum[1 - flag]);
  48.             sum[flag] += i + 1, cnt[flag] += 1;
  49.             dbg(d);
  50.             ret = (ret + d) % mod;
  51.         }
  52.         return (ret << b) % mod;
  53.     };
  54.  
  55.     for (ll i = 0; i < 31; ++i)
  56.         ans = (ans + count_bit(i)) % mod;
  57.     cout << ans << '\n';
  58. }
  59.  
  60. void solve()
  61. {
  62.     ll n, ans = 0;
  63.     cin >> n;
  64.     vl a(n);
  65.     for (auto &x : a)
  66.         cin >> x;
  67.  
  68.     auto count_bit = [&](ll b) {
  69.         ll ret = 0;
  70.         vl acc(n), oc(n), ec(n), os(n), es(n);
  71.         for (ll i = 0; i < n; ++i) {
  72.             ll c = (a[i] >> b) & 1;
  73.             acc[i] = c + (i > 0 ? acc[i - 1] : 0);
  74.         }
  75.         for (ll i = n - 1; i >= 0; --i) {
  76.             ll v = acc[i] % 2;
  77.             oc[i] = (i < n - 1 ? oc[i + 1] : 0) + v;
  78.             ec[i] = (i < n - 1 ? ec[i + 1] : 0) + 1 - v;
  79.             os[i] = (i < n - 1 ? os[i + 1] : 0) + (v ? i : 0);
  80.             es[i] = (i < n - 1 ? es[i + 1] : 0) + (1 - v ? i : 0);
  81.         }
  82.         for (ll i = 0, zc = 0; i < n; ++i) {
  83.             ll flag = (a[i] >> b) & 1;
  84.             zc += 1;
  85.             if (flag) {
  86.                 const auto &vs = acc[i] % 2 ? os : es;
  87.                 const auto &cs = acc[i] % 2 ? oc : ec;
  88.                 auto v = vs[i] + cs[i];
  89.                 auto d = (v * zc - cs[i] * zc * (i + i - zc + 1) / 2) % mod;
  90.                 dbg(d, v, zc);
  91.                 ret = (ret + d) % mod;
  92.                 zc = 0;
  93.             }
  94.         }
  95.         return (ret << b) % mod;
  96.     };
  97.     for (ll i = 0; i < 31; ++i)
  98.         ans = (ans + count_bit(i)) % mod;
  99.     cout << ans << '\n';
  100. }
  101.  
  102. void solve_wa()
  103. {
  104.     ll n, ans = 0;
  105.     cin >> n;
  106.     vl a(n);
  107.     for (auto &x : a)
  108.         cin >> x;
  109.  
  110.     auto count_bit = [&](ll b) {
  111.         ll ret = 0;
  112.         vl acc(n), oc(n), ec(n);
  113.         for (ll i = 0; i < n; ++i) {
  114.             ll c = (a[i] >> b) & 1;
  115.             acc[i] = c + (i > 0 ? acc[i - 1] : 0);
  116.         }
  117.         for (ll i = n - 1; i >= 0; --i) {
  118.             ll v = acc[i] % 2;
  119.             oc[i] = (i < n - 1 ? oc[i + 1] : 0) + v;
  120.             ec[i] = (i < n - 1 ? ec[i + 1] : 0) + 1 - v;
  121.         }
  122.         for (ll i = 0, zc = 0; i < n; ++i) {
  123.             ll flag = (a[i] >> b) & 1;
  124.             zc += 1;
  125.             if (flag) {
  126.                 const auto &vs = acc[i] % 2 ? oc : ec;
  127.                 auto v = vs[i];
  128.                 auto gain = v * (v + 1) / 2;
  129.                 auto gain2 = (gain + gain + v * (zc - 1)) * zc / 2;
  130.                 if (b == 1)
  131.                     dbg(gain2);
  132.                 ret = (ret + gain2) % mod;
  133.                 zc = 0;
  134.             }
  135.         }
  136.         if (b == 1) {
  137.             dbg(acc);
  138.             dbg(ec);
  139.             dbg(oc);
  140.         }
  141.         return (ret << b) % mod;
  142.     };
  143.     for (ll i = 0; i < 31; ++i)
  144.         ans = (ans + count_bit(i)) % mod;
  145.     cout << ans << '\n';
  146. }
  147.  
  148. int main(int argc, char **argv)
  149. {
  150.     solve_edt();
  151.     return 0;
  152. };
  153.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement