StoneHaos

COPP2

Dec 16th, 2019
145
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Степени двойки
  2.  
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <math.h>
  7. #include <stdio.h>
  8. #include <set>
  9. #define nl "\n"
  10.  
  11. using namespace std;
  12.  
  13. int func(int num) {
  14.     int ret = 0;
  15.     for (; num != 0; ++ ret)
  16.         num &= num - 1;
  17.     return ret;
  18. }
  19.  
  20. multiset<int> get_step(int num) {
  21.     multiset<int> ret;
  22.     while (num != 0) {
  23.         ret.insert(num - (num&(num - 1)));
  24.         num &= num - 1;
  25.     }
  26.     return ret;
  27. }
  28.  
  29. int main(void) {
  30.     int x, y;
  31.     scanf("%d%d", &x, &y);
  32.     int a = func(x);
  33.     if (y > x || y < a)
  34.         printf("NO\n");
  35.     else {
  36.         printf("YES\n");
  37.         multiset<int> b = get_step(x);
  38.         for (; a != y; ++ a) {
  39.             int elem = *(b.rbegin());
  40.             b.erase(-- b.end());
  41.             elem >>= 1;
  42.             b.insert(elem);
  43.             b.insert(elem);
  44.         }
  45.         for (auto iter = b.begin(); iter != b.end(); ++ iter)
  46.             cout << *iter << " ";
  47.         cout << nl;
  48.     }
  49.     return 0;
  50. }
RAW Paste Data