#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdint>
#include <bitset>
using namespace std;
int mypopcount(uint32_t x){
return bitset<32>(x).count();
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
vector<int> cumbitsum;
vector<int> results;
cumbitsum.reserve(n/8);
cumbitsum.push_back(0);
int ind =0;
int totalbits=0;
while (cumbitsum[ind]<n){
ind++;
totalbits += mypopcount(ind);
cumbitsum.push_back(totalbits);
}
while (n>0){
while (cumbitsum[ind-1]>=n) ind--;
//cumbitsum[ind-1]<n
n-=mypopcount(ind);
results.push_back(ind);
ind--;
}
cout<<results.size()<<endl;
copy(begin(results), end(results),ostream_iterator<int>(std::cout, " "));
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 | #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <cstdint> #include <bitset> using namespace std; int mypopcount(uint32_t x){ return bitset<32>(x).count(); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; vector<int> cumbitsum; vector<int> results; cumbitsum.reserve(n/8); cumbitsum.push_back(0); int ind =0; int totalbits=0; while (cumbitsum[ind]<n){ ind++; totalbits += mypopcount(ind); cumbitsum.push_back(totalbits); } while (n>0){ while (cumbitsum[ind-1]>=n) ind--; //cumbitsum[ind-1]<n n-=mypopcount(ind); results.push_back(ind); ind--; } cout<<results.size()<<endl; copy(begin(results), end(results),ostream_iterator<int>(std::cout, " ")); cout<<endl; return 0; } |
English