agc031 C Differ by 1 Bit
24013 ワード
転送ゲート:https://atcoder.jp/contests/agc031/tasks/agc031_c
問題:
x x x or yを考えると、問題は0->x x or yから
2 n−1 2^n−1 2 n−1は奇数であるため,すべてのx x o r y x~xor~y x or yに偶数個の1無解がある.
我々が任意に下位を交換することは関係ないので,000…−>111(k(k奇数)個1)00…,000…−>111(k奇数)個1)00…,000…−>111(k奇数)個1)00…,000…−>111(k奇数)個1)00…,000…,000…−
s(n,k)s(n,k)s(n,k)s(n,k)はk個の1がある場合の答えを表す.
k=1の時、明らかにあります:強制第1位は0で、後ろは任意に歩き終わって、n-1、kの任意の情況を通じて押してそれから第1位を1に変えて、後ろの逆さまに歩いて後ろの全0に戻ることができます
k>=3の場合
1位を0に固定することを考慮して,s(n−1,k−2)s(n−1,k−2)s(n−1,k−2)s(n−1,k−2)s
1位を1に変更して、今后の位を全0(歩く时は异なります)と見なして、s(n-1,1)を歩いて、1の位置がn-k+1のところに移ることに注意します.
問題:
x x x or yを考えると、問題は0->x x or yから
2 n−1 2^n−1 2 n−1は奇数であるため,すべてのx x o r y x~xor~y x or yに偶数個の1無解がある.
我々が任意に下位を交換することは関係ないので,000…−>111(k(k奇数)個1)00…,000…−>111(k奇数)個1)00…,000…−>111(k奇数)個1)00…,000…−>111(k奇数)個1)00…,000…,000…−
s(n,k)s(n,k)s(n,k)s(n,k)はk個の1がある場合の答えを表す.
k=1の時、明らかにあります:強制第1位は0で、後ろは任意に歩き終わって、n-1、kの任意の情況を通じて押してそれから第1位を1に変えて、後ろの逆さまに歩いて後ろの全0に戻ることができます
k>=3の場合
1位を0に固定することを考慮して,s(n−1,k−2)s(n−1,k−2)s(n−1,k−2)s(n−1,k−2)s
1位を1に変更して、今后の位を全0(歩く时は异なります)と見なして、s(n-1,1)を歩いて、1の位置がn-k+1のところに移ることに注意します.
#include
#include
#include
#include
#include
#define ll long long
#define db double
#define ld long double
#define pp printf
#define fo(i, x, y) for(int i = x, B = y; i <= B; i ++)
#define ff(i, x, y) for(int i = x, B = y; i < B; i ++)
#define fd(i, x, y) for(int i = x, B = y; i >= B; i --)
#define pb push_back
#define sz size()
using namespace std;
vector<int> a[18][18];
int z[1 << 18];
int us[20], to[20];
void zh(int x, int y, int n) {
ff(i, 0, n) us[i] = 0;
ff(i, 0, n) {
ff(j, 0, n) if((x >> i & 1) == (y >> j & 1) && !us[j])
{ us[j] = 1; to[i] = j; break;}
}
ff(i, 0, 1 << n) {
int s = 0;
ff(j, 0, n) s += (i >> j & 1) * (1 << to[j]);
z[i] = s;
}
}
int n, x, y, c;
void pr(int x, int n) {
fd(i, n - 1, 0) pp("%d", x >> i & 1); pp(" ");
}
int main() {
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
n = 17;
a[1][1].pb(0); a[1][1].pb(1);
fo(i, 2, n) {
int mx = 1 << (i - 1);
ff(k, 0, a[i - 1][1].sz)
a[i][1].pb(a[i - 1][1][k]);
fd(k, a[i - 1][1].sz - 1, 0)
a[i][1].pb(a[i - 1][1][k] + mx);
for(int j = 3; j <= i; j += 2) {
ff(k, 0, a[i - 1][j - 2].sz)
a[i][j].pb(a[i - 1][j - 2][k]);
int h = a[i - 1][j - 2][a[i - 1][j - 2].sz - 1];
zh(1 << (i - 2), 1 << (i - j), i - 1);
ff(k, 0, a[i - 1][1].sz)
a[i][j].pb((z[a[i - 1][1][k]] ^ h) + (1 << (i - 1)));
}
}
scanf("%d %d %d", &n, &x, &y);
ff(i, 0, n) c += (x ^ y) >> i & 1;
if(c % 2 == 0) {
pp("NO
"); return 0;
}
pp("YES
");
zh(a[n][c][a[n][c].sz - 1], x ^ y, n);
ff(k, 0, a[n][c].sz) pp("%d ", z[a[n][c][k]] ^ x);
}