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;
}
posted @ 2025-04-11 15:24  WHUStar  阅读(11)  评论(0)    收藏  举报