/* TASK: cnums LANG: C++ */ #include #include #include #include #include #include #define NAME "cnums" /* boilerplate */ int debug; char *in; FILE *fin, *fout; void panic(char *fmt, ...) { va_list arg; va_start(arg, fmt); fprintf(stderr, "panic: "); vfprintf(stderr, fmt, arg); fprintf(stderr, "\n"); *(char*)0=0; } void setup(int argc, char **argv) { /* setup, input */ while(argc > 1 && strcmp(argv[1], "-d")==0) debug++, argc--, argv++; if(argc > 1){ in = argv[1]; fout = stdout; }else{ in = NAME ".in"; fout = fopen(NAME ".out", "w"); if(fout == NULL) panic("cannot open " NAME ".out"); } fin = fopen(in, "r"); if(fin == NULL) panic("cannot open %s", in); setbuf(stdout, 0); setbuf(stderr, 0); } int ones(unsigned int x) { int n = 0; for(; x; x>>=1) n += x&1; return n; } int main(int argc, char **argv) { int lo, hi, n; setup(argc, argv); fscanf(fin, "%d %d", &lo, &hi); for(n = 0; lo<=hi; lo++) if(ones(lo) <= 4) n++; else lo += (lo&-lo)-1; /* change xxx1000 to xxx1111 */ fprintf(fout, "%d\n", n); return 0; }