用组合数解决P8764 二进制问题
其它题解都是数位 dp,我来发一篇用组合数的求解。
题意
求
思路
首先我们举一个简单的例子:当二进制下的
可以发现,
我们再来看一个更一般的例子:当二进制下的
同样,我们可以先枚举低六位,在
现在我们应该就能发现解决这个问题的一般方法了:从左往右扫
代码
#include <iostream>
#define int long long
using namespace std;
long long C(long long b, long long a) // 计算组合(b在下面,a在上面)
{
long long sum = 1;
for (long long i = b, j = 1; j <= a; i--, j++)
sum = sum * i / j;
return sum;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n, k;
cin >> n >> k;
int cnt = 0, ans = 0;
if (n == k && k == 1)
{
ans = 1;
cout << ans;
return 0;
}
for (int i = 62; i >= 1; --i)
{
if (k - cnt + 1 == 0)
break;
if ((1ll << i) & n)
{
cnt++;
if (i >= k - cnt + 1)
ans += C(i, k - cnt + 1);
}
}
if (cnt == k)
ans++;
cout << ans;
return 0;
}