#include <iostream>
#include <math.h>
using namespace std;
int bitsOn[1000000+2];
int main() {
bitsOn[1] = 1;
bitsOn[2] =1 ;
for(int i=1;i<=1000000;i++) {
if(i - (i & (-i)) == 0) {
bitsOn[i] = 1;
continue;
}
int highest = floor(log2(i));
//cout<<"i: "<<i<<", hogh:" <<highest<<"\n";
bitsOn[i] = 1 + bitsOn[i-(1<<highest-1)];
}
int n;
cin>>n;
int result = 0;
int idx = 0;
while(result < n) {
result += bitsOn[idx+1];
idx++;
}
if(result == n)
cout<<idx;
else
cout<<idx-1;
cout<<"\n";
int surplus = result-n;
bool fixed = false;
//cout<<"surplus: "<<surplus<<endl;
for(int i=idx;i>=1;i--) {
if(fixed == false && bitsOn[i] == surplus) {
fixed = true;
continue;
}
cout<<i<<" ";
}
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 | #include <iostream> #include <math.h> using namespace std; int bitsOn[1000000+2]; int main() { bitsOn[1] = 1; bitsOn[2] =1 ; for(int i=1;i<=1000000;i++) { if(i - (i & (-i)) == 0) { bitsOn[i] = 1; continue; } int highest = floor(log2(i)); //cout<<"i: "<<i<<", hogh:" <<highest<<"\n"; bitsOn[i] = 1 + bitsOn[i-(1<<highest-1)]; } int n; cin>>n; int result = 0; int idx = 0; while(result < n) { result += bitsOn[idx+1]; idx++; } if(result == n) cout<<idx; else cout<<idx-1; cout<<"\n"; int surplus = result-n; bool fixed = false; //cout<<"surplus: "<<surplus<<endl; for(int i=idx;i>=1;i--) { if(fixed == false && bitsOn[i] == surplus) { fixed = true; continue; } cout<<i<<" "; } return 0; } |
English