Submission #4891161
Source Code Expand
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i))
#define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i))
#define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i))
#define ALL(x) begin(x), end(x)
using namespace std;
vector<int> func(int n, int k) {
default_random_engine gen;
assert (k % 2 == 1);
vector<int> p(1 << n);
REP (i, 1 << n) {
p[i] = (i ^ (i >> 1));
}
assert (__builtin_popcount(p.back()) == 1);
while (__builtin_popcount(p.back()) < k) {
int found = -1;
double max_value = -1;
REP3 (i, 1, 1 << n) {
if (__builtin_popcount(p[i - 1] ^ p.back()) == 1 and __builtin_popcount(p[i]) > __builtin_popcount(p.back())) {
assert (__builtin_popcount(p[i]) == __builtin_popcount(p.back()) + 2);
double value = 1 + uniform_real_distribution<double>()(gen);
if (max_value < value) {
max_value = value;
found = i;
}
}
if (__builtin_popcount(p[i - 1] ^ p.back()) == 1 and __builtin_popcount(p[i]) == __builtin_popcount(p.back())) {
double value = uniform_real_distribution<double>()(gen);
if (max_value < value) {
max_value = value;
found = i;
}
}
}
assert (found != -1);
reverse(p.begin() + found, p.end());
}
assert (__builtin_popcount(p.back()) == k);
return p;
}
bool bit(int x, int i) {
return x & (1 << i);
}
int swap_bits(int x, int i, int j) {
if (bit(x, i) != bit(x, j)) {
x ^= 1 << i;
x ^= 1 << j;
}
return x;
}
vector<int> solve1(int n, int b) {
int k = __builtin_popcount(b);
if (k % 2 == 0) {
return vector<int>();
}
vector<int> p = func(n, k);
REP (i, 1 << n) {
int c = p.back();
REP (k1, n) {
if (bit(c, k1) != bit(b, k1)) {
REP (k2, n) if (k2 != k1) {
if (bit(c, k2) != bit(b, k2) and bit(c, k2) == bit(b, k1)) {
c = swap_bits(c, k1, k2);
p[i] = swap_bits(p[i], k1, k2);
break;
}
}
}
}
assert (c == b);
}
assert (p.front() == 0);
assert (p.back() == b);
return p;
}
vector<int> solve(int n, int a, int b) {
vector<int> p = solve1(n, b ^ a);
if (p.empty()) return p;
REP (i, 1 << n) {
p[i] ^= a;
}
return p;
}
int main() {
int n, a, b; cin >> n >> a >> b;
vector<int> p = solve(n, a, b);
if (p.empty()) {
cout << "NO" << endl;
} else {
cout << "YES" << endl;
for (int p_i : p) {
cout << p_i << ' ';
}
cout << endl;
// check
assert (p.front() == a);
assert (p.back() == b);
REP (i, (1 << n) - 1) {
assert (__builtin_popcount(p[i] ^ p[i + 1]) == 1);
}
}
return 0;
}
Submission Info
| Submission Time | |
|---|---|
| Task | C - Differ by 1 Bit |
| User | kimiyuki |
| Language | C++14 (GCC 5.4.1) |
| Score | 800 |
| Code Size | 3173 Byte |
| Status | AC |
| Exec Time | 36 ms |
| Memory | 1536 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 800 / 800 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | sample-01.txt, sample-02.txt |
| All | 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt, 01-46.txt, 01-47.txt, 01-48.txt, 01-49.txt, sample-01.txt, sample-02.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 01-01.txt | AC | 1 ms | 256 KiB |
| 01-02.txt | AC | 1 ms | 256 KiB |
| 01-03.txt | AC | 1 ms | 256 KiB |
| 01-04.txt | AC | 1 ms | 256 KiB |
| 01-05.txt | AC | 1 ms | 256 KiB |
| 01-06.txt | AC | 1 ms | 256 KiB |
| 01-07.txt | AC | 1 ms | 256 KiB |
| 01-08.txt | AC | 1 ms | 256 KiB |
| 01-09.txt | AC | 1 ms | 256 KiB |
| 01-10.txt | AC | 1 ms | 256 KiB |
| 01-11.txt | AC | 1 ms | 256 KiB |
| 01-12.txt | AC | 1 ms | 256 KiB |
| 01-13.txt | AC | 1 ms | 256 KiB |
| 01-14.txt | AC | 1 ms | 256 KiB |
| 01-15.txt | AC | 1 ms | 256 KiB |
| 01-16.txt | AC | 1 ms | 256 KiB |
| 01-17.txt | AC | 1 ms | 256 KiB |
| 01-18.txt | AC | 1 ms | 256 KiB |
| 01-19.txt | AC | 1 ms | 256 KiB |
| 01-20.txt | AC | 1 ms | 256 KiB |
| 01-21.txt | AC | 1 ms | 256 KiB |
| 01-22.txt | AC | 2 ms | 256 KiB |
| 01-23.txt | AC | 1 ms | 256 KiB |
| 01-24.txt | AC | 3 ms | 256 KiB |
| 01-25.txt | AC | 1 ms | 256 KiB |
| 01-26.txt | AC | 4 ms | 384 KiB |
| 01-27.txt | AC | 1 ms | 256 KiB |
| 01-28.txt | AC | 7 ms | 512 KiB |
| 01-29.txt | AC | 1 ms | 256 KiB |
| 01-30.txt | AC | 14 ms | 896 KiB |
| 01-31.txt | AC | 1 ms | 256 KiB |
| 01-32.txt | AC | 25 ms | 1536 KiB |
| 01-33.txt | AC | 36 ms | 1536 KiB |
| 01-34.txt | AC | 28 ms | 1536 KiB |
| 01-35.txt | AC | 33 ms | 1536 KiB |
| 01-36.txt | AC | 33 ms | 1536 KiB |
| 01-37.txt | AC | 32 ms | 1536 KiB |
| 01-38.txt | AC | 28 ms | 1536 KiB |
| 01-39.txt | AC | 31 ms | 1536 KiB |
| 01-40.txt | AC | 26 ms | 1536 KiB |
| 01-41.txt | AC | 27 ms | 1536 KiB |
| 01-42.txt | AC | 31 ms | 1536 KiB |
| 01-43.txt | AC | 32 ms | 1536 KiB |
| 01-44.txt | AC | 33 ms | 1536 KiB |
| 01-45.txt | AC | 31 ms | 1536 KiB |
| 01-46.txt | AC | 28 ms | 1536 KiB |
| 01-47.txt | AC | 30 ms | 1536 KiB |
| 01-48.txt | AC | 27 ms | 1536 KiB |
| 01-49.txt | AC | 25 ms | 1536 KiB |
| sample-01.txt | AC | 1 ms | 256 KiB |
| sample-02.txt | AC | 1 ms | 256 KiB |