fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // ------------------------------------------------------------
  5. // Bài toán: Đếm cặp (i, j) sao cho (a_i | a_j) <= x
  6. // Ý tưởng:
  7. // - Giữ lại chỉ các bit mà x bật (gọi là k bit).
  8. // - Nén mỗi a_i thành mask k-bit (chỉ gồm các bit có trong x).
  9. // - SOS DP đếm số a_i là submask của mỗi mask.
  10. // ------------------------------------------------------------
  11.  
  12. int main() {
  13. ios::sync_with_stdio(false);
  14. cin.tie(nullptr);
  15.  
  16. int n; long long x;
  17. cin >> n >> x;
  18.  
  19. // Bước 1. Lưu vị trí các bit bật của x
  20. vector<int> bits;
  21. for (int b = 0; b < 30; ++b)
  22. if (x >> b & 1)
  23. bits.push_back(b);
  24.  
  25. int k = bits.size(); // số bit bật của x
  26. int full_mask = (1 << k); // chỉ cần duyệt các submask của x
  27. vector<int> freq(full_mask, 0);
  28.  
  29. // Bước 2. Nén mỗi a_i thành mask con của x
  30. for (int i = 0; i < n; ++i) {
  31. long long a; cin >> a;
  32. int mask = 0;
  33. for (int j = 0; j < k; ++j)
  34. if (a >> bits[j] & 1)
  35. mask |= (1 << j);
  36. if ((a | x) == x) // chỉ giữ các số không có bit ngoài x
  37. freq[mask]++;
  38. }
  39.  
  40. // Bước 3. SOS DP: cnt[m] = số lượng a_i là submask của m
  41. vector<long long> cnt(freq.begin(), freq.end());
  42. for (int b = 0; b < k; ++b)
  43. for (int mask = 0; mask < full_mask; ++mask)
  44. if (mask >> b & 1)
  45. cnt[mask] += cnt[mask ^ (1 << b)];
  46.  
  47. // Bước 4. Đếm số cặp có OR <= x (tức OR là submask của x)
  48. long long ans = 0;
  49. for (int mask = 0; mask < full_mask; ++mask) {
  50. long long c = cnt[mask];
  51. ans += c * (c - 1) / 2;
  52. }
  53.  
  54. cout << ans << "\n";
  55. }
  56.  
Success #stdin #stdout 0.01s 5316KB
stdin
153 138258403
44004431 66873746 22419362 52466945 45707086 31598329 72731413 53531853 86046704 47801613 1067012 77453866 28285476 40029061 40680135 50075874 25261202 55364631 34393547 95863808 38620738 22678351 30119625 19215611 4224563 36067703 81325629 1365713 84570826 10497492 39652799 96401032 21032269 99503485 1555420 66814540 10899137 47812848 44298163 81213211 72093725 48316821 78679336 57022899 95490965 89897814 67306571 51243625 94651711 936647 66414541 59031999 80713602 43815585 9357402 17816959 59385803 27472256 96015558 23625908 95072308 46842215 9957797 53483844 21829159 61633062 39557530 65408335 26718363 29498829 48303613 60938593 74248375 66555990 83328465 40931144 49787727 79065202 37929069 76184590 349983 97264473 40622540 52566755 32384625 71161789 40960923 48650186 69193535 12816175 24392123 92757216 15089371 29290717 8454053 13096092 35605391 11417499 34119360 23048471 21640393 83887373 92777821 76015685 72056496 11844974 96019578 84046151 49326675 86147088 20006794 3784906 83011858 83659153 26132634 120197 2959383 17742853 74264551 83319398 981502 37874248 96306664 13126576 56620286 57656532 6369815 10917684 66705296 32536622 19848611 18396111 66445838 61629673 60677488 28085239 92185325 50951915 41952311 96358821 67307025 90454713 57927797 71639765 12345303 80566918 95391242 61009587 17915052 10967008 49342936 50742860 92210835
stdout
0