题目链接:https://vjudge.net/contest/349653#problem/B
题目:
给出一个n,一个x,要求构造除一个序列ai,(1<= ai < 2^n)。
要求这个序列的任意一段子序列bi~bj的区间和sum != x 并且sum != 0。
要求你构造出这个ai序列。
思路:
因为a^b = c, 所以a^c = b,然后我们考虑i和i^x中我们之选择一个,
然后我们求出相邻的两个数字的异或值a(i) ^ a(i-1),所以这两个值得到的异或值一定不等于x且不等于0。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = (1<<18)+5;
bool vis[N] = {false};
int a[N] = {0},tot,n,m;
int main(void)
{
scanf("%d%d",&n,&m);
int r = (1<<n)-1;
tot = 0;
vis[0] = vis[m] = true;
for(int i=1;i<=r;i++)
{
if(vis[i] == true) continue;
vis[i] = vis[i^m] = true;
a[++tot] = i;
}
printf("%d\n",tot);
for(int i=1;i<=tot;i++)
{
if(i>1) printf(" ");
printf("%d",a[i]^a[i-1]);
}
return 0;
}