P8644题解

· · 题解

貌似题解区里没有这种思路,紧发一波。

题面

戳这里

思路

可以利用异或运算的性质来表示 AB 的关系(A 表示 0B 表示 1)。

初始状态直接 O(2^n) 枚举就可以了。

因为 \dfrac{h\times(h+1)}{2}=n+m<231,所以 h<21 其中 h 为它的层数。

勿抄袭

代码

#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; 
}
int 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 ans=0;
    for(int i=0;i<(1<<h);i++)//位运算枚举底层情况
    {
        int cnt=cal(i),k=i;//统计B的数量即可 
        for(int j=h-1;j>=1;j--)
        {
            k=k^(k>>1);
            k&=((1<<j)-1);
            cnt+=cal(k);
        }
        if(cnt==m) ans++;
    }
    cout<<ans;//完结撒花
}