#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; } |
English