#include <algorithm>
#include <ctime>
#include <iostream>
using namespace std;
const unsigned ALL_ONES = (unsigned)-1;
int czeros_fast(unsigned Q) {
if (Q == 0) return 8*sizeof(Q);
if (Q == ALL_ONES) return 0;
unsigned state = Q | Q<<1 | 1;
int steps = 1;
if (state == ALL_ONES) return 1;
while (true) {
unsigned new_state = state | state<<steps;
if (new_state == ALL_ONES) break;
state = new_state;
steps *= 2;
}
int lo = steps, hi = 2*steps;
while (hi-lo > 1) {
int med = lo+(hi-lo)/2;
unsigned med_state = state | state<<(med-steps);
if (med_state == ALL_ONES) hi = med; else lo = med;
}
return hi;
}
int main() {
time_t tstart;
unsigned Q;
long long total;
tstart = clock();
Q = 0;
total = 0;
do { total += czeros_fast(Q); ++Q; } while (Q < 123456789);
cout << "fast: " << total << " " << double(clock()-tstart)/CLOCKS_PER_SEC << endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCB1bnNpZ25lZCBBTExfT05FUyA9ICh1bnNpZ25lZCktMTsKCmludCBjemVyb3NfZmFzdCh1bnNpZ25lZCBRKSB7CiAgICBpZiAoUSA9PSAwKSByZXR1cm4gOCpzaXplb2YoUSk7CiAgICBpZiAoUSA9PSBBTExfT05FUykgcmV0dXJuIDA7CiAgICB1bnNpZ25lZCBzdGF0ZSA9IFEgfCBRPDwxIHwgMTsKICAgIGludCBzdGVwcyA9IDE7CiAgICBpZiAoc3RhdGUgPT0gQUxMX09ORVMpIHJldHVybiAxOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB1bnNpZ25lZCBuZXdfc3RhdGUgPSBzdGF0ZSB8IHN0YXRlPDxzdGVwczsKICAgICAgICBpZiAobmV3X3N0YXRlID09IEFMTF9PTkVTKSBicmVhazsKICAgICAgICBzdGF0ZSA9IG5ld19zdGF0ZTsKICAgICAgICBzdGVwcyAqPSAyOwogICAgfQogICAgaW50IGxvID0gc3RlcHMsIGhpID0gMipzdGVwczsKICAgIHdoaWxlIChoaS1sbyA+IDEpIHsKICAgICAgICBpbnQgbWVkID0gbG8rKGhpLWxvKS8yOwogICAgICAgIHVuc2lnbmVkIG1lZF9zdGF0ZSA9IHN0YXRlIHwgc3RhdGU8PChtZWQtc3RlcHMpOwogICAgICAgIGlmIChtZWRfc3RhdGUgPT0gQUxMX09ORVMpIGhpID0gbWVkOyBlbHNlIGxvID0gbWVkOwogICAgfQogICAgcmV0dXJuIGhpOwp9CgppbnQgbWFpbigpIHsKICAgIHRpbWVfdCB0c3RhcnQ7CiAgICB1bnNpZ25lZCBROwogICAgbG9uZyBsb25nIHRvdGFsOwoKICAgIHRzdGFydCA9IGNsb2NrKCk7CiAgICBRID0gMDsKICAgIHRvdGFsID0gMDsKICAgIGRvIHsgdG90YWwgKz0gY3plcm9zX2Zhc3QoUSk7ICsrUTsgfSB3aGlsZSAoUSA8IDEyMzQ1Njc4OSk7CiAgICBjb3V0IDw8ICJmYXN0OiAiIDw8IHRvdGFsIDw8ICIgIiA8PCBkb3VibGUoY2xvY2soKS10c3RhcnQpL0NMT0NLU19QRVJfU0VDIDw8IGVuZGw7Cn0=