#include <cstdio> int liczba[150000],n; int a[150000]; int zliczBity(int x){ if(x<=0) return 0; return x%2 + zliczBity(x/2); } int main(){ scanf("%d",&n); liczba[0] = 0; liczba[1] = 1; for(int i=2; i<=120210; i++){ liczba[i] = liczba[i-1] + zliczBity(i); //printf("%d\n",liczba[i]); } int ile = 0; int zostalo = n; int i; for(i=1; i<=n; i++){ if(liczba[i] >= n){ zostalo = n - zliczBity(i); a[ ile++ ] = i; //printf("Z:%d i:%d \n",zostalo,i); break; } } for(--i; zostalo>0 && i>0 ;i--){ if(liczba[i] >= zostalo){ while(zostalo <= liczba[i] && i>0) { //printf("i:%d, zostalo:%d, liczba[i]:%d\n",i,zostalo,liczba[i]); i--; } //go deep as far possible i++; zostalo -= zliczBity(i); a[ ile++ ] = i; //printf("z:%d i:%d\n",zostalo,i); } } printf("%d\n",ile); for(int i=0; i<ile; i++){ printf("%d ",a[i]); } printf("\n"); 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 <cstdio> int liczba[150000],n; int a[150000]; int zliczBity(int x){ if(x<=0) return 0; return x%2 + zliczBity(x/2); } int main(){ scanf("%d",&n); liczba[0] = 0; liczba[1] = 1; for(int i=2; i<=120210; i++){ liczba[i] = liczba[i-1] + zliczBity(i); //printf("%d\n",liczba[i]); } int ile = 0; int zostalo = n; int i; for(i=1; i<=n; i++){ if(liczba[i] >= n){ zostalo = n - zliczBity(i); a[ ile++ ] = i; //printf("Z:%d i:%d \n",zostalo,i); break; } } for(--i; zostalo>0 && i>0 ;i--){ if(liczba[i] >= zostalo){ while(zostalo <= liczba[i] && i>0) { //printf("i:%d, zostalo:%d, liczba[i]:%d\n",i,zostalo,liczba[i]); i--; } //go deep as far possible i++; zostalo -= zliczBity(i); a[ ile++ ] = i; //printf("z:%d i:%d\n",zostalo,i); } } printf("%d\n",ile); for(int i=0; i<ile; i++){ printf("%d ",a[i]); } printf("\n"); return 0; } |