#include <bits/stdc++.h>
using namespace std;
constexpr int MAXN = 1e6 + 17;
int bity[MAXN];
int dokiedy[MAXN];
void Preorder()
{
for(int i = 1; i < MAXN; ++i)
{
int bit = 0;
int j = i;
while(j)
{
if(j % 2 == 1)
++bit;
j /= 2;
}
bity[i] = bit;
dokiedy[i] = dokiedy[i-1] + bit;
}
}
int UperBound(int n, int p = 0, int k = MAXN)
{
int s = (p+k)/2;
if(p == k)
return s;
if(dokiedy[s] < n)
return UperBound(n, s+1, k);
if(dokiedy[s] > n)
return UperBound(n, p, s);
return s;
}
int main()
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
int n;
cin >> n;
Preorder();
vector <int> odp;
while(n)
{
int in = UperBound(n);
odp.push_back(in);
n -= bity[in];
}
int sise = odp.size();
cout << sise << "\n";
for(int i = 0; i < sise; ++i)
cout << odp[i] << " ";
}
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 53 54 55 | #include <bits/stdc++.h> using namespace std; constexpr int MAXN = 1e6 + 17; int bity[MAXN]; int dokiedy[MAXN]; void Preorder() { for(int i = 1; i < MAXN; ++i) { int bit = 0; int j = i; while(j) { if(j % 2 == 1) ++bit; j /= 2; } bity[i] = bit; dokiedy[i] = dokiedy[i-1] + bit; } } int UperBound(int n, int p = 0, int k = MAXN) { int s = (p+k)/2; if(p == k) return s; if(dokiedy[s] < n) return UperBound(n, s+1, k); if(dokiedy[s] > n) return UperBound(n, p, s); return s; } int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); int n; cin >> n; Preorder(); vector <int> odp; while(n) { int in = UperBound(n); odp.push_back(in); n -= bity[in]; } int sise = odp.size(); cout << sise << "\n"; for(int i = 0; i < sise; ++i) cout << odp[i] << " "; } |
English