<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;
}