#include <iostream> #include <vector> #include <algorithm> using namespace std; int calculateBits(int x) { int bitNum=0; while (x>0) { if (x%2==1) bitNum++; x/=2; } return bitNum; } int main() { int n; cin>>n; // stworz tabelke sum skumulowanych zapalonych bitow dla liczb calkowitych od 1 do k vector<int> cumsum; cumsum.push_back(0); int num=1; while(cumsum.back() <n) { int b = calculateBits(num); num++; cumsum.push_back(cumsum.back() + b); } // odczytaj minimalny leksykograficznie, ściśle malejący ciąg, którego elementy mają sumarycznie zapalonych dokładnie n bitów vector<int> seq; while(n>0) { auto it=lower_bound(cumsum.begin(), cumsum.end(), n); seq.push_back(it-cumsum.begin()); n-=(*it - *(it-1)); } cout << seq.size() << endl; for (auto it=seq.begin(); it!=seq.end(); ++it) cout<<*it<<' '; cout<<endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <iostream> #include <vector> #include <algorithm> using namespace std; int calculateBits(int x) { int bitNum=0; while (x>0) { if (x%2==1) bitNum++; x/=2; } return bitNum; } int main() { int n; cin>>n; // stworz tabelke sum skumulowanych zapalonych bitow dla liczb calkowitych od 1 do k vector<int> cumsum; cumsum.push_back(0); int num=1; while(cumsum.back() <n) { int b = calculateBits(num); num++; cumsum.push_back(cumsum.back() + b); } // odczytaj minimalny leksykograficznie, ściśle malejący ciąg, którego elementy mają sumarycznie zapalonych dokładnie n bitów vector<int> seq; while(n>0) { auto it=lower_bound(cumsum.begin(), cumsum.end(), n); seq.push_back(it-cumsum.begin()); n-=(*it - *(it-1)); } cout << seq.size() << endl; for (auto it=seq.begin(); it!=seq.end(); ++it) cout<<*it<<' '; cout<<endl; return 0; } |