P8644题解
貌似题解区里没有这种思路,紧发一波。
题面
戳这里
思路
可以利用异或运算的性质来表示
初始状态直接
因为
勿抄袭
代码
#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;//完结撒花
}