#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(); } } |
English