参考博客,写的不错
可以直接构造一个前缀异或和序列,要求1.前缀不能有等于0的。2.任意两个前缀异或和的异或不能为x(两个前缀异或和的异或表示一段区间)3.不能有相等的异或前缀.
bool book[1 << 18];
int main()
{
int n, x;
while (cin >> n >> x)
{
vector<int> ans;
book[0] = true;
f(i, 1, (1 << n)-1)//构造一个前缀异或和序列
{
if (!book[i^x])
{
ans.emplace_back(i);
book[i] = true;
}
}
cout << ans.size()<< endl;
if (ans.size() == 0)continue;
f(i, 0, ans.size()-1)
{
if (i == 0)printf("%d ", ans[i]);
else
printf("%d ", ans[i] ^ ans[i - 1]);//用前缀异或和求每一项
}
puts("");
}
return 0;
}