#ifndef LOCAL
// #pragma GCC optimize("Ofast,unroll-loops")
#endif
#include <climits>
#include <unordered_map>
#include <random>
#include <chrono>
#include <numeric>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <deque>
#include <stack>
#include <functional>
#include <bitset>
#include <string>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <list>
#include <forward_list>
#include <set>
#include <unordered_set>
#include <cstdint>
#include <ext/pb_ds/assoc_container.hpp>
#ifndef LOCAL
// #pragma GCC target("avx,avx2,fma")
#endif
using namespace std;
using namespace __gnu_pbds;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
#define all(x) begin(x), end(x)
#define isz(x) ((int)size(x))
#define X first
#define Y second
#define mp make_pair
int count_hits(const int n, const vector<int>& p) {
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (abs(i - j) == abs(p[i] - p[j])) {
++ans;
}
}
}
return ans;
}
void solve() {
int n;
cin >> n;
vector<int> p(n);
iota(all(p), 0);
mt19937 rng;
shuffle(all(p), rng);
int ans = count_hits(n, p);
int best_ans = ans;
vector<int> p_ans = p;
auto start = clock();
ld temp = 10000;
while (clock() - start < 2000) {
int i = rng() % n;
int j = rng() % n;
if (i > j) swap(i, j);
auto cur = p;
reverse(cur.begin() + i, cur.begin() + j);
int cur_ans = count_hits(n, cur);
if (cur_ans < ans || 1.L * rng() / INT_MAX < exp(-(ans - cur_ans) / temp)) {
ans = cur_ans;
p = cur;
if (ans < best_ans) {
best_ans = ans;
p_ans = p;
}
}
temp *= 0.995;
}
cerr << best_ans << '\n';
for (auto it : p_ans) cout << it + 1 << ' ';
cout << '\n';
}
signed main() {
#ifdef LOCAL
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0)->sync_with_stdio(0);
int t = 1;
// cin >> t;
while (t --> 0) {
solve();
}
}
I2lmbmRlZiBMT0NBTAogIC8vICNwcmFnbWEgR0NDIG9wdGltaXplKCJPZmFzdCx1bnJvbGwtbG9vcHMiKQojZW5kaWYKI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxkZXF1ZT4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGJpdHNldD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxmc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaWZuZGVmIExPQ0FMCiAgLy8gI3ByYWdtYSBHQ0MgdGFyZ2V0KCJhdngsYXZ4MixmbWEiKQojZW5kaWYKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIG5hbWVzcGFjZSBfX2dudV9wYmRzOwoKdXNpbmcgbGwgPSBsb25nIGxvbmc7CnVzaW5nIHVsbCA9IHVuc2lnbmVkIGxvbmcgbG9uZzsKdXNpbmcgbGQgPSBsb25nIGRvdWJsZTsKCiNkZWZpbmUgYWxsKHgpIGJlZ2luKHgpLCBlbmQoeCkKI2RlZmluZSBpc3ooeCkgKChpbnQpc2l6ZSh4KSkKI2RlZmluZSBYIGZpcnN0CiNkZWZpbmUgWSBzZWNvbmQKI2RlZmluZSBtcCBtYWtlX3BhaXIKCmludCBjb3VudF9oaXRzKGNvbnN0IGludCBuLCBjb25zdCB2ZWN0b3I8aW50PiYgcCkgewogIGludCBhbnMgPSAwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewogICAgICBpZiAoYWJzKGkgLSBqKSA9PSBhYnMocFtpXSAtIHBbal0pKSB7CiAgICAgICAgKythbnM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGFuczsKfQoKdm9pZCBzb2x2ZSgpIHsKICBpbnQgbjsKICBjaW4gPj4gbjsKICB2ZWN0b3I8aW50PiBwKG4pOwogIGlvdGEoYWxsKHApLCAwKTsKICBtdDE5OTM3IHJuZzsKICBzaHVmZmxlKGFsbChwKSwgcm5nKTsKICBpbnQgYW5zID0gY291bnRfaGl0cyhuLCBwKTsKICBpbnQgYmVzdF9hbnMgPSBhbnM7CiAgdmVjdG9yPGludD4gcF9hbnMgPSBwOwogIGF1dG8gc3RhcnQgPSBjbG9jaygpOwogIGxkIHRlbXAgPSAxMDAwMDsKICB3aGlsZSAoY2xvY2soKSAtIHN0YXJ0IDwgMjAwMCkgewogICAgaW50IGkgPSBybmcoKSAlIG47CiAgICBpbnQgaiA9IHJuZygpICUgbjsKICAgIGlmIChpID4gaikgc3dhcChpLCBqKTsKICAgIGF1dG8gY3VyID0gcDsKICAgIHJldmVyc2UoY3VyLmJlZ2luKCkgKyBpLCBjdXIuYmVnaW4oKSArIGopOwogICAgaW50IGN1cl9hbnMgPSBjb3VudF9oaXRzKG4sIGN1cik7CiAgICBpZiAoY3VyX2FucyA8IGFucyB8fCAxLkwgKiBybmcoKSAvIElOVF9NQVggPCBleHAoLShhbnMgLSBjdXJfYW5zKSAvIHRlbXApKSB7CiAgICAgIGFucyA9IGN1cl9hbnM7CiAgICAgIHAgPSBjdXI7CiAgICAgIGlmIChhbnMgPCBiZXN0X2FucykgewogICAgICAgIGJlc3RfYW5zID0gYW5zOwogICAgICAgIHBfYW5zID0gcDsKICAgICAgfQogICAgfQogICAgdGVtcCAqPSAwLjk5NTsKICB9CiAgY2VyciA8PCBiZXN0X2FucyA8PCAnXG4nOwogIGZvciAoYXV0byBpdCA6IHBfYW5zKSBjb3V0IDw8IGl0ICsgMSA8PCAnICc7CiAgY291dCA8PCAnXG4nOwp9IAoKc2lnbmVkIG1haW4oKSB7CiAgI2lmZGVmIExPQ0FMCiAgICAvLyBmcmVvcGVuKCJpbi50eHQiLCAiciIsIHN0ZGluKTsKICAgIC8vIGZyZW9wZW4oIm91dC50eHQiLCAidyIsIHN0ZG91dCk7CiAgI2VuZGlmCiAgY2luLnRpZSgwKS0+c3luY193aXRoX3N0ZGlvKDApOwogIGludCB0ID0gMTsKICAvLyBjaW4gPj4gdDsKICB3aGlsZSAodCAtLT4gMCkgewogICAgc29sdmUoKTsKICB9Cn0=