P8644 [蓝桥杯 2016 国 B] 机器人塔
链接
https://www.luogu.com.cn/problem/P8644
思路
因为生成最底下一层之后就可以确定以上所有的情况,这时候统计b的数量为满足要求的即可。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int cal(int x)
{
int res = 0;
for (; x; x -= (x & (-x))) res++;
return res;
}
signed main()
{
int n, m, h;
cin >> n >> m;
for (int i = 1; i <= 21; i++)
if ((i * (i + 1) / 2) == n + m)
{
h = i;
break;
}
int answer = 0;
for (int i = 0; i < (1 << h); i++)
{
int cnt = cal(i), k = i; // cnt统计B的数量,k保存当前层状态
// 逐层生成并统计
for (int j = h - 1; j >= 1; j--)
{
k = k ^ (k >> 1); // 异或生成上一层
k &= ((1 << j) - 1); // 掩码保留有效位数 ,也就是为1的才算b
cnt += cal(k); // 累加B的数量
}
if (cnt == m) answer++;// B总数等于m时,答案加1
}
cout << answer;
}

浙公网安备 33010602011771号