| #include <bits/stdc++.h> |
| using namespace std; |
|
|
| const int T = 15; |
|
|
| struct PairXY { |
| short x = 0, y = 0; |
| }; |
|
|
| unsigned char bitPos[1005][T]; |
|
|
| int main() { |
| ios::sync_with_stdio(false); |
| cin.tie(nullptr); |
|
|
| int n; |
| if (!(cin >> n)) return 0; |
|
|
| if (n == 1) { |
| cout << 1 << " " << 1 << '\n'; |
| cout.flush(); |
| return 0; |
| } |
|
|
| int pow3[T + 1]; |
| pow3[0] = 1; |
| for (int i = 1; i <= T; ++i) pow3[i] = pow3[i - 1] * 3; |
| int arr_size = pow3[T]; |
|
|
| vector<PairXY> arr(arr_size); |
|
|
| mt19937 rng((unsigned)chrono::steady_clock::now().time_since_epoch().count()); |
|
|
| |
| for (int i = 1; i <= n; ++i) { |
| while (true) { |
| for (int k = 0; k < T; ++k) { |
| bitPos[i][k] = (unsigned char)(rng() & 1); |
| } |
| bool ok = true; |
| for (int j = 1; j < i && ok; ++j) { |
| int idx1 = 0, idx2 = 0; |
| for (int k = 0; k < T; ++k) { |
| int d1 = (int)bitPos[j][k] - (int)bitPos[i][k]; |
| int d2 = -d1; |
| idx1 = idx1 * 3 + (d1 + 1); |
| idx2 = idx2 * 3 + (d2 + 1); |
| } |
| if (arr[idx1].x != 0 || arr[idx2].x != 0) { |
| ok = false; |
| break; |
| } |
| } |
| if (ok) { |
| for (int j = 1; j < i; ++j) { |
| int idx1 = 0, idx2 = 0; |
| for (int k = 0; k < T; ++k) { |
| int d1 = (int)bitPos[j][k] - (int)bitPos[i][k]; |
| int d2 = -d1; |
| idx1 = idx1 * 3 + (d1 + 1); |
| idx2 = idx2 * 3 + (d2 + 1); |
| } |
| arr[idx1].x = (short)i; arr[idx1].y = (short)j; |
| arr[idx2].x = (short)j; arr[idx2].y = (short)i; |
| } |
| break; |
| } |
| } |
| } |
|
|
| vector<int> posVal(n + 1, -1); |
|
|
| |
| for (int val = 1; val + 1 <= n; val += 2) { |
| int a = val; |
| int b = val + 1; |
| int D[T]; |
|
|
| for (int k = 0; k < T; ++k) { |
| cout << 0; |
| for (int i = 1; i <= n; ++i) { |
| int v = (bitPos[i][k] ? b : a); |
| cout << ' ' << v; |
| } |
| cout << '\n'; |
| cout.flush(); |
|
|
| int score; |
| if (!(cin >> score)) return 0; |
| D[k] = score - 1; |
| } |
|
|
| int key = 0; |
| for (int k = 0; k < T; ++k) { |
| key = key * 3 + (D[k] + 1); |
| } |
| PairXY pr = arr[key]; |
| int x = pr.x; |
| int y = pr.y; |
| posVal[a] = x; |
| posVal[b] = y; |
| } |
|
|
| if (n % 2 == 1) { |
| int last = n; |
| vector<char> used(n + 1, 0); |
| for (int v = 1; v <= n - 1; ++v) { |
| if (posVal[v] >= 1 && posVal[v] <= n) |
| used[posVal[v]] = 1; |
| } |
| int lastpos = 1; |
| while (lastpos <= n && used[lastpos]) ++lastpos; |
| if (lastpos > n) lastpos = 1; |
| posVal[last] = lastpos; |
| } |
|
|
| vector<int> perm(n + 1, 0); |
| for (int v = 1; v <= n; ++v) { |
| int pos = posVal[v]; |
| if (pos >= 1 && pos <= n) perm[pos] = v; |
| } |
| |
| for (int i = 1; i <= n; ++i) if (perm[i] == 0) perm[i] = 1; |
|
|
| cout << 1; |
| for (int i = 1; i <= n; ++i) { |
| cout << ' ' << perm[i]; |
| } |
| cout << '\n'; |
| cout.flush(); |
|
|
| return 0; |
| } |