http://codeforces.com/contest/1174/problem/D
任意的两子段异或和 的 异或 等价于 任意两个 前缀异或和 si 和 sj , si≠sj 并且 si^sj≠x 也等价于 si只能出现一次 si^x 也只能出现一次,所以只要从1到2的n次方 进行枚举前缀异或和 然后 用 s[i+1] ^s[i] 求出 a[i+1] 就是结果
代码:
#include<bits/stdc++.h>
using namespace std;
int vis[300005];
int a[300005];
int main()
{
int n,x;
cin>>n>>x;
memset(vis,0,sizeof(vis));
vis[x]=1;
int cnt=0;
int ls=0;
for(int i=1;i<(1<<n);i++)
{
if(!vis[i])vis[i^x]=1,a[++cnt]=ls^i, ls=i;
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
{
printf("%d",a[i]);
if(i!=cnt)printf(" ");
else printf("\n");
}
return 0;
}