题解思路,题目中也有点提醒的味道,
A sequence b is a subsegment of a sequence
a if
b can be obtained from
a by deletion of several (possibly, zero or all) elements from the beginning and several (possibly, zero or all) elements from the end.(subsegment(子段)不能断续,子序列可以subsequence)
(英语水平有待提高.......)
构造前缀异或和数组,ai+a(i+1)+....+a(j)=b(i-1)⊕b(j),ai=b(i-1)⊕bi,由于1≤ai<(1<<n),所以前缀和bi也属于该范围,bi中不能相等,相等则有0,b(i)⊕x=b(j),b(i)⊕b(j)=x,所以b(j)不能出现,
#include<bits/stdc++.h>
#include<vector>
using namespace std;
typedef long long ll;
bool vis[1<<18];
int main()
{
vector<int>a;
ll n,x,i,j;
cin>>n>>x;
n=1<<n;
memset(vis,false,sizeof(vis));
vis[x]=true;
a.push_back(0);
for(i=1;i<n;i++)
{
if(vis[i])
continue;
else
{
a.push_back(i);
vis[i^x]=true;
vis[i]=true;
}
}
printf("%d\n",a.size()-1);
for(i=1;i<a.size();i++)
{
printf("%d ",a[i]^a[i-1]);
}
cout<<endl;
return 0;
}