Advertisement
Hamoudi30

Lucky Numbers

Sep 16th, 2021
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.54 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define SZ(v) ((int)(v.size()))
  5. #include <ext/pb_ds/assoc_container.hpp>
  6. #include <ext/pb_ds/tree_policy.hpp>
  7. using namespace __gnu_pbds;
  8. template<class T> using indexed_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
  9. constexpr int N = 2e6+9;
  10. bool isLucky [N] = {false};
  11. constexpr int MAX = 8388608+9; // interval[2 ^ log2(N) + 2]
  12. int interval[MAX];
  13. int build (int st = 0, int ed = N - 1, int parent = 1) {
  14.     if (st == ed) return interval[parent] = 1;
  15.     return interval[parent] = build(st, (st + ed) / 2, 2 * parent) + build((st + ed) / 2 + 1, ed, 2 * parent + 1);
  16. }
  17. int insert (int num, int st = 0, int ed = N - 1, int parent = 1) {
  18.     interval[parent]++;
  19.     if (st == ed)
  20.         return interval[parent] - 1;
  21.     if (num <= (st + ed) / 2) {
  22.         return insert(num, st, (st + ed) / 2, 2 * parent);
  23.     }
  24.     return interval[2 * parent] + insert(num, (st + ed) / 2 + 1, ed, 2 * parent + 1);
  25. }
  26. int delKth (int kth, int st = 0, int ed = N - 1, int parent = 1) {
  27.     interval[parent]--;
  28.     if (st == ed)
  29.         return st;
  30.     if (interval[2 * parent] >= kth) {
  31.         return delKth(kth, st, (st + ed) / 2, 2 * parent);
  32.     }
  33.     return delKth(kth - interval[2 * parent], (st + ed) / 2 + 1, ed, 2 * parent + 1);
  34. }
  35. int getKth (int kth, int st = 0, int ed = N - 1, int parent = 1) {
  36.     if (st == ed)
  37.         return st;
  38.     if (interval[2 * parent] >= kth) {
  39.         return getKth(kth, st, (st + ed) / 2, 2 * parent);
  40.     }
  41.     return getKth(kth - interval[2 * parent], (st + ed) / 2 + 1, ed, 2 * parent + 1);
  42. }
  43. int remove (int num, int st = 0, int ed = N - 1, int parent = 1) {
  44.     interval[parent]--;
  45.     if (st == ed)
  46.         return interval[parent] + 1;
  47.     if (num <= (st + ed) / 2)
  48.         return remove(num, st, (st + ed) / 2, 2 * parent);
  49.     return interval[2 * parent] + remove(num, (st + ed) / 2 + 1, ed, 2 * parent + 1);
  50. }
  51. int displayElements (int st = 0, int ed = N - 1, int parent = 1) {
  52.     if (st < ed) {
  53.         displayElements(st, (st + ed) / 2, 2 * parent);
  54.         displayElements((st + ed) / 2 + 1, ed, 2 * parent + 1);
  55.     }
  56.     if (st == ed) {
  57.         int count = interval[parent];
  58.         while (count--) {
  59.             cout << st << " ";
  60.         }
  61.     }
  62. }
  63. void pre_process () {
  64.     for (int i = 1; i < N; i += 2)
  65.         insert(i);
  66.     isLucky[1] = true;
  67.     int available = 1000000; // (2e6 / 2) = 1e6
  68.     for (int start = 2; start <= available; ++start) {
  69.         int next = 1, term = getKth(start), deleted = 0;
  70.         isLucky[term] = true;
  71.         while (term * next - deleted <= available) {
  72.             delKth(term * next - deleted);
  73.             deleted++;
  74.             next++;
  75.             available--;
  76.         }
  77.     }
  78. }
  79. void run () {
  80.     int n;
  81.     while (cin >> n) {
  82.         int mid = n / 2;
  83.         bool found = false;
  84.         if (n % 2 == 0) {
  85.             for (int k = mid; k > 0; k--) {
  86.                 if (isLucky[k] && isLucky[n - k]) {
  87.                     cout << n << " is the sum of " << k << " and " << n - k << ".\n";
  88.                     found = true;
  89.                     break;
  90.                 }
  91.             }
  92.          }
  93.         if (not found) cout << n << " is not the sum of two luckies!\n";
  94.     }
  95. }
  96. int main() {
  97.     ios_base::sync_with_stdio(false);
  98.     cin.tie(nullptr);
  99.     cout.tie(nullptr);
  100.     pre_process();
  101. //    freopen("/home/hamoudi/Coding/run.in", "r", stdin);
  102.     int tt = 1;
  103. //    cin >> tt;
  104.     while (tt--)
  105.         run();
  106.     return 0;
  107. }
  108.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement