RT,甚至回溯都是不需要的,应该有正确性保证,但是我们不是很会证。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,k,p[1<<20],v[1<<20];
vector<int>a,b;
void dfs(int x)
{
a.push_back(x);v[x]=1;
if(a.size()==(1<<n)){puts("1");for(int x:a)cout<<x<<" ";exit(0);}
for(int c:b)if(!v[c^x])dfs(c^x);
}
int main()
{
cin>>n>>k;if(k%2==0){puts("0");exit(0);}
for(int i=0;i<(1<<n);i++)if(__builtin_popcount(i)==k)b.push_back(i);
dfs(0);puts("0");
}