#include <bits/stdc++.h>
using namespace std;
const int MAXN{1<<18};
int n,k;
int cnt(int x)
{
x&=-x;
if (!(x>>n-k+1)) return ((1<<k)-1)*x;
else return (x>>n-k)-1|(((1<<k)-1)*x&(1<<n)-1);
}
int main()
{
cin>>n>>k;
if (!(k&1)||n!=1&&n==k)
{
cout<<"0"<<endl;
return 0;
}
cout<<"1\n0"<<endl;
for (int i{1},c{0};i<(1<<n);++i)
printf("%d ",c^=cnt(i));
return 0;
}
算法解释:在 n=4,k=3 时的异或(即变化)值:
| i | cnt(i) | ansi |
|---|
| 0 | - | 0000 |
| 1 | 0111 | 0111 |
| 2 | 1110 | 1001 |
| 3 | 0111 | 1110 |
| 3 | 1101 | 0011 |
| … | … | … |
类似于根据每次 i 的 lowbit 循环左移
不知道算法对不对