#include<bits/stdc++.h> using namespace std; vector<int> potegi; int ile_bitow[1000*1000+7]; bool czy_uzyc[1000*1000+7]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, k=0; cin >> n; potegi.push_back(1); while(potegi[potegi.size()-1]<1000*1000){ potegi.push_back(potegi[potegi.size()-1]*2); } int i=0, j=0; while(n>0){ ++i; if(i==potegi[j]){ ++j; ile_bitow[i] = 1; } else{ ile_bitow[i] = ile_bitow[i-potegi[j-1]]+1; } czy_uzyc[i] = true; ++k; if(ile_bitow[i]>n){ n = ile_bitow[i]-n; for(int m=i-1; m>0; --m){ if(ile_bitow[m] <= n){ n-=ile_bitow[m]; czy_uzyc[m] = false; --k; } if(n==0) break; } break; } n-=ile_bitow[i]; } cout << k << '\n'; for(int m=i; i>0; --i){ if(czy_uzyc[i]) 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 48 49 50 51 | #include<bits/stdc++.h> using namespace std; vector<int> potegi; int ile_bitow[1000*1000+7]; bool czy_uzyc[1000*1000+7]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, k=0; cin >> n; potegi.push_back(1); while(potegi[potegi.size()-1]<1000*1000){ potegi.push_back(potegi[potegi.size()-1]*2); } int i=0, j=0; while(n>0){ ++i; if(i==potegi[j]){ ++j; ile_bitow[i] = 1; } else{ ile_bitow[i] = ile_bitow[i-potegi[j-1]]+1; } czy_uzyc[i] = true; ++k; if(ile_bitow[i]>n){ n = ile_bitow[i]-n; for(int m=i-1; m>0; --m){ if(ile_bitow[m] <= n){ n-=ile_bitow[m]; czy_uzyc[m] = false; --k; } if(n==0) break; } break; } n-=ile_bitow[i]; } cout << k << '\n'; for(int m=i; i>0; --i){ if(czy_uzyc[i]) cout << i << ' '; } return 0; } |