#include <stdio.h>
unsigned long long binom(unsigned n, unsigned k) {
if (k == 0 || n == k) return 1;
if (n < k) return 0;
if (k > (n >> 1)) k = n-k;
unsigned long long res = n, j;
// We're not doing all we can to avoid overflow, as this is a proof of concept,
// not production code.
for(j = 2; j <= k; ++j) {
res *= (n+1-j);
res /= j;
}
return res;
}
unsigned popcount(unsigned long long n) {
unsigned k = 0;
while(n) {
++k;
n &= (n-1);
}
return k;
}
unsigned long long rank(unsigned long long n) {
if (n == 0) return 1;
unsigned p = 0, k = popcount(n);
unsigned long long mask = 1,h = n >> 1;
while(h > 0) {
++p;
h >>= 1;
}
mask <<= p;
unsigned long long r = binom(p,k);
r += rank(n-mask);
return r;
}
int main()
{
unsigned long long n;
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp1bnNpZ25lZCBsb25nIGxvbmcgYmlub20odW5zaWduZWQgbiwgdW5zaWduZWQgaykgewogICAgaWYgKGsgPT0gMCB8fCBuID09IGspIHJldHVybiAxOwogICAgaWYgKG4gPCBrKSByZXR1cm4gMDsKICAgIGlmIChrID4gKG4gPj4gMSkpIGsgPSBuLWs7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVzID0gbiwgajsKICAgIC8vIFdlJ3JlIG5vdCBkb2luZyBhbGwgd2UgY2FuIHRvIGF2b2lkIG92ZXJmbG93LCBhcyB0aGlzIGlzIGEgcHJvb2Ygb2YgY29uY2VwdCwKICAgIC8vIG5vdCBwcm9kdWN0aW9uIGNvZGUuCiAgICBmb3IoaiA9IDI7IGogPD0gazsgKytqKSB7CiAgICAgICAgcmVzICo9IChuKzEtaik7CiAgICAgICAgcmVzIC89IGo7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9Cgp1bnNpZ25lZCBwb3Bjb3VudCh1bnNpZ25lZCBsb25nIGxvbmcgbikgewogICAgdW5zaWduZWQgayA9IDA7CiAgICB3aGlsZShuKSB7CiAgICAgICAgKytrOwogICAgICAgIG4gJj0gKG4tMSk7CiAgICB9CiAgICByZXR1cm4gazsKfQoKdW5zaWduZWQgbG9uZyBsb25nIHJhbmsodW5zaWduZWQgbG9uZyBsb25nIG4pIHsKICAgIGlmIChuID09IDApIHJldHVybiAxOwogICAgdW5zaWduZWQgcCA9IDAsIGsgPSBwb3Bjb3VudChuKTsKICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXNrID0gMSxoID0gbiA+PiAxOwogICAgd2hpbGUoaCA+IDApIHsKICAgICAgICArK3A7CiAgICAgICAgaCA+Pj0gMTsKICAgIH0KICAgIG1hc2sgPDw9IHA7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgciA9IGJpbm9tKHAsayk7CiAgICByICs9IHJhbmsobi1tYXNrKTsKICAgIHJldHVybiByOwp9CgppbnQgbWFpbigpCnsKCXVuc2lnbmVkIGxvbmcgbG9uZyBuOwoKCXNjYW5mKCAiJWxsZCIsICZuICk7CgoJcHJpbnRmKCAiJWxsZCIsIHJhbmsoIG4gKSApOwoKCXJldHVybiAwOwp9