/Số nhị phân có nghĩa

<Problem>

https://oj.vnoi.info/problem/binary
              #include <iostream>
      using namespace std;
      
      int main() {
        int f[33][33];
      
        for (int i = 0; i < 33; i++)
          for (int j = 0; j < 33; j++) f[i][j] = 0;
      
        // i : so bit, k : so chu so 0, chu so dau luon bang 1
        
        for (int i = 1; i < 33; i++) f[i][0] = 1;
      
        for (int i = 1; i < 33; i++) {
          for (int k = 1; k < i; k++) {
            f[i][k] = f[i - 1][k - 1] + f[i - 1][k];
          }
        }
      
        int n, k;
      
        while (cin >> n >> k) {
      
          if (k > 31) {
            cout << 0 << endl;
            continue;
          }
      
          int ans = 0;
      
          int d[33]{ 0 };
      
          int digit = 0;
      
          int t = 0;
          while (n > 0) {
            d[digit++] = n % 2;
            if (n % 2 == 0) t++;
            n /= 2;
          }
          if (t == k) ans++;
      
          for (int i = 1; i < digit; i++) ans += f[i][k];
          int cnt = 0;
      
          for (int i = digit - 2; i >= 0; i--) {
            if (d[i] == 1) {
              if (k - cnt - 1 >= 0)
              ans += f[i + 1][k - cnt - 1];
            }
            else {
              cnt++;
            }
          }
      
          if (k == 1) ans++;
      
          cout << ans << endl;
        }
      
        return 0;
      }