Advertisement
azari_iva

Untitled

Mar 20th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.64 KB | None | 0 0
  1. unsigned f(unsigned n, unsigned k) {
  2.     if (n < 2) {
  3.         return k <= 1 & (n != 0) & ~k;
  4.     }
  5.  
  6.     unsigned res;
  7.     unsigned m = -1, r = 0;
  8.    
  9.     unsigned i;
  10.     unsigned Cn, Ck, Cres;
  11.    
  12.     i = n;
  13.     while (i != 0) {
  14.         i >>= 1;
  15.         m ++;
  16.     }
  17.  
  18.     i = 1 << (m - 1);
  19.     while ((n & i) == 0 && i != 0) {
  20.         i >>= 1;
  21.         r ++;
  22.     }
  23.  
  24.     Cn = m;
  25.     Ck = k + 1;
  26.     if (Ck > Cn) {
  27.         goto M1;
  28.     } else if (Ck * 2 > n) {
  29.         Ck = Cn - Ck;
  30.     }
  31.     if (Ck == 0) {
  32.         res = 1;
  33.         goto M1;
  34.     }
  35.     res = Cn;
  36.     i = 2;
  37.     while (i <= Ck) {
  38.         res *= (Cn - i + 1);
  39.         res /= i;
  40.         i ++;
  41.     }  
  42.  
  43. M1:
  44.     n ^= (1 << m);
  45.     k -= r;
  46.     m -= (r + 1);
  47.     r = 0;
  48.  
  49.     i = 1 << (m - 1);
  50.     while ((n & i) == 0 && i != 0) {
  51.         i >>= 1;
  52.         r ++;
  53.     }
  54.  
  55.     while (1) {
  56.         if (n == 0) {
  57.             return res + (k == 0);
  58.         }
  59.         if (k == 0) {
  60.             return res + (n == (1 << (m + 1)) - 1);
  61.         }
  62.  
  63.         Cn = m;
  64.         Ck = k - 1;
  65.         if (Ck > Cn) {
  66.             goto M;
  67.         } else if (Ck * 2 > n) {
  68.             Ck = Cn - Ck;
  69.         }
  70.         if (Ck == 0) {
  71.             res += 1;
  72.             goto M;
  73.         }
  74.         Cres = Cn;
  75.         i = 2;
  76.         while (i <= Ck) {
  77.             Cres *= (Cn - i + 1);
  78.             Cres /= i;
  79.             i ++;
  80.         }
  81.         res += Cres;
  82. M:
  83.         n ^= (1 << m);
  84.         k -= r;
  85.         m -= (r + 1);
  86.         r = 0;
  87.         i = 1 << (m - 1);
  88.         while ((n & i) == 0 && i != 0) {
  89.             i >>= 1;
  90.             r ++;
  91.         }
  92.     }      
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement