Advertisement
pb_jiang

T4WA

May 18th, 2024
816
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. using ll = long long;
  2.  
  3. class Solution {
  4.     int fpow(ll a, ll p, ll m) {
  5.         assert(p >= 0);
  6.         ll ret = 1;
  7.         ll cur = a;
  8.         while(p) {
  9.             if (p & 1)
  10.                 ret = ret * cur % m;
  11.             cur = cur * cur % m;
  12.             p >>= 1;
  13.         }
  14.         return int(ret % m);
  15.     }
  16.     ll g(ll x) {
  17.         // count the number of elements of first x strong array given x = 2^n;
  18.         if (x == 0)  return 0;
  19.         ll ret = 0;
  20.         for (ll i = 1; i <= x; i <<= 1) {
  21.             ret = ret * 2 + i;
  22.         }
  23.         return ret;
  24.     }
  25.     ll h(ll x) {
  26.         // count the sum of elements of first x strong array;
  27.         // return (x - 1) * x / 2;
  28.         ll t = x / 2;
  29.         return (t + 1) * t;
  30.     }
  31.     ll f(ll x) {
  32.         // count the sum of elements of first x elements in big_nums;
  33.         cout << "\nx: " << x << endl;
  34.         if (x == 0) return 1;
  35.         ll ret = 0, rem = x, v = 0;
  36.         for (ll i = 31, bits = 0; i > 0; --i) {
  37.             ll ec = 1ll << (i - 1);
  38.             ll picked_num = bits * ec, pick_val = v * ec + h(ec);
  39.             ll num_it = g(ec) + picked_num;
  40.             if (num_it > rem) {
  41.                 continue;
  42.             } else {
  43.                 cout << "rem: " << rem << " num_it: " << num_it << " ec: " << ec << " g(ec): " << g(ec) << " picked_num: " << picked_num << " bits: " << bits << endl;
  44.                 rem -= num_it;
  45.                 bits += 1;
  46.                 v |= ec;
  47.                 ret += pick_val;
  48.             }
  49.         }
  50.         cout << "\nrem: " << rem << " ret: " << ret << " x:" << x << " v: " << v << endl;
  51.         // rem -= 1;
  52.         if (rem) {
  53.             v += 1;
  54.             while(rem && v) {
  55.                 // cout << rem << endl;
  56.                 ret += __builtin_ctz(v & -v);
  57.                 v = v & (v - 1);
  58.                 rem -= 1;
  59.             }
  60.         }
  61.         cout << "f(" << x << "): " << ret <<endl;
  62.         return ret;
  63.     }
  64. public:
  65.     vector<int> findProductsOfElements(vector<vector<long long>>& qs) {
  66.         // cout << "g(8): " << g(8) << " h(8): " << h(8) << endl;
  67.         // cout << "f(2): " << f(2) << endl;
  68.         // cout << "f(5): " << f(5) << endl;
  69.         int n = qs.size();
  70.         vector<int> ret(n);
  71.         for (int i = 0; i < n; ++i) {
  72.             ll l = qs[i][0], r = qs[i][1], m = qs[i][2];
  73.             // cout << "i: " << i << endl;
  74.             ret[i] = fpow(2, f(r + 1) - f(l), m);
  75.         }
  76.         return ret;
  77.     }
  78. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement