Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unsigned f(unsigned n, unsigned k) {
- if (n < 2) {
- return k <= 1 & (n != 0) & ~k;
- }
- unsigned res;
- unsigned m = -1, r = 0;
- unsigned i;
- unsigned Cn, Ck, Cres;
- i = n;
- while (i != 0) {
- i >>= 1;
- m ++;
- }
- i = 1 << (m - 1);
- while ((n & i) == 0 && i != 0) {
- i >>= 1;
- r ++;
- }
- Cn = m;
- Ck = k + 1;
- if (Ck > Cn) {
- goto M1;
- } else if (Ck * 2 > n) {
- Ck = Cn - Ck;
- }
- if (Ck == 0) {
- res = 1;
- goto M1;
- }
- res = Cn;
- i = 2;
- while (i <= Ck) {
- res *= (Cn - i + 1);
- res /= i;
- i ++;
- }
- M1:
- n ^= (1 << m);
- k -= r;
- m -= (r + 1);
- r = 0;
- i = 1 << (m - 1);
- while ((n & i) == 0 && i != 0) {
- i >>= 1;
- r ++;
- }
- while (1) {
- if (n == 0) {
- return res + (k == 0);
- }
- if (k == 0) {
- return res + (n == (1 << (m + 1)) - 1);
- }
- Cn = m;
- Ck = k - 1;
- if (Ck > Cn) {
- goto M;
- } else if (Ck * 2 > n) {
- Ck = Cn - Ck;
- }
- if (Ck == 0) {
- res += 1;
- goto M;
- }
- Cres = Cn;
- i = 2;
- while (i <= Ck) {
- Cres *= (Cn - i + 1);
- Cres /= i;
- i ++;
- }
- res += Cres;
- M:
- n ^= (1 << m);
- k -= r;
- m -= (r + 1);
- r = 0;
- i = 1 << (m - 1);
- while ((n & i) == 0 && i != 0) {
- i >>= 1;
- r ++;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement