#include <bits/stdc++.h> using namespace std; int pref[1000001]; int ile[1000001]; queue <int> koleja; void wypelnij(){ for(int i=1;i<1000001;i++){ ile[i]=__builtin_popcountll(i); pref[i]=pref[i-1]+ile[i]; } } int binsercz(int k,int maks){ int l=0; int p=maks; while(l<p){ int s=(p+l)/2; if(pref[s]<k){ l=s+1; }else{ p=s; } } return p; } int main(){ pref[0]=0; wypelnij(); //cerr << " X " << '\n'; int n; scanf("%d",&n); while(n>0){ int x=binsercz(n,n+1); n-=ile[x]; koleja.push(x); //cerr << " N " << n << '\n'; } printf("%d\n",koleja.size()); while(koleja.size()){ printf("%d ", koleja.front()); koleja.pop(); } }
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 | #include <bits/stdc++.h> using namespace std; int pref[1000001]; int ile[1000001]; queue <int> koleja; void wypelnij(){ for(int i=1;i<1000001;i++){ ile[i]=__builtin_popcountll(i); pref[i]=pref[i-1]+ile[i]; } } int binsercz(int k,int maks){ int l=0; int p=maks; while(l<p){ int s=(p+l)/2; if(pref[s]<k){ l=s+1; }else{ p=s; } } return p; } int main(){ pref[0]=0; wypelnij(); //cerr << " X " << '\n'; int n; scanf("%d",&n); while(n>0){ int x=binsercz(n,n+1); n-=ile[x]; koleja.push(x); //cerr << " N " << n << '\n'; } printf("%d\n",koleja.size()); while(koleja.size()){ printf("%d ", koleja.front()); koleja.pop(); } } |