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