問題の意味:
2つの数値を与えられ\(\ N-)及び(X \)\は、設定配列を構築\([L] \) (\(Lの\)不確定)
\(1 \) 、\ (1 \のLeq A [I] <2 ^ {N-} \)
\(2 \) 、配列XORの配列からとする(0 \)を\または\(X \)
\(3 \)、\ ( Lの\)が最大であるべきである
:分析
\ \(1)の前に配置され、\(Iは\)数字との排他的論理和され(sum_ {I}を\)\、次いで、([I、J] \ \ ) 排他的論理和のそしてため\(sum_ {I} 1-⨁sum_{J} \) 、私たちは見つけることができる\(SUM \)アレイ、満足
\ [\ FORALL I、J、sum_ {I} \ oplus sum_ {J} \ NEQ 0 \&\&sum_ {I} \ oplus sum_ {J} \ NEQ X \]
\(2 \) 、異なる特性または有する\を(y⨁z= X \) 、そこ(y⨁x= Z \)\、および任意の番号\(Y \)、\ (Zは\)のみですA。それ以来\(Y \)と\(Z \)バイナリ超えにくい(2 ^ {N} \ \し ) 、その結果、とは対照的に、\(Y \)と\(Z \)で\( 2 ^ {N} \)内のペアで、設定\(Iは\)から(1 \)\横断\(2 ^ {N} \) 、我々はだろう(私は\)\トークン即ち多数の反対することができ、私たちを得ることができます\(SUM \)配列
\(。3 \)、\ ([I] = SUM [I]⨁sum[-I。1] \)出力配列に、
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
using namespace std;
const int maxn = (ll) 5e5 + 5;
const int mod = 1000000007;
const int mod2 = 1000000006;
const int inf = (ll) 1e9 + 5;
bool vis[maxn];
signed main() {
start;
int n, x;
cin >> n >> x;
vis[x] = vis[0] = true;
vector<int> ans;
ans.push_back(0);
for (int i = 1; i < (1 << n); ++i)
if (!vis[i]) {
ans.push_back(i);
vis[i ^ x] = true;
}
cout << ans.size() - 1 << '\n';
for (int i = 1; i < ans.size(); ++i)
cout << (ans[i - 1] ^ ans[i]) << ' ';
return 0;
}