#include <iostream>
#include <vector>
using namespace std;
int tree_size;
vector<int> tree;
void tree_add(int idx, int delta) {
for (; idx <= tree_size; idx += idx & -idx) {
tree[idx] += delta;
}
}
int tree_query(int idx) {
int sum = 0;
for (; idx > 0; idx -= idx & -idx) {
sum += tree[idx];
}
return sum;
}
int find_kth_free(int k) {
int idx = 0;
for (int i = 1 << 16; i > 0; i >>= 1) {
if (idx + i <= tree_size && tree[idx + i] < k) {
idx += i;
k -= tree[idx];
}
}
return idx + 1;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
if (!(cin >> n)) return 0;
tree_size = n;
tree.assign(n + 1, 0);
vector<int> result(n + 1);
for (int i = 1; i <= n; i++) {
tree_add(i, 1);
}
int current_free_rank = 0;
for (int i = 1; i <= n; i++) {
int free_slots_left = n - i + 1;
current_free_rank = (current_free_rank + i) % free_slots_left;
int target_rank = current_free_rank + 1;
int actual_pos = find_kth_free(target_rank);
result[actual_pos] = i;
tree_add(actual_pos, -1);
current_free_rank = target_rank - 1;
}
for (int i = 1; i <= n; i++) {
cout << result[i] << " ";
}
cout << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgdHJlZV9zaXplOwp2ZWN0b3I8aW50PiB0cmVlOwp2b2lkIHRyZWVfYWRkKGludCBpZHgsIGludCBkZWx0YSkgewogICAgZm9yICg7IGlkeCA8PSB0cmVlX3NpemU7IGlkeCArPSBpZHggJiAtaWR4KSB7CiAgICAgICAgdHJlZVtpZHhdICs9IGRlbHRhOwogICAgfQp9CmludCB0cmVlX3F1ZXJ5KGludCBpZHgpIHsKICAgIGludCBzdW0gPSAwOwogICAgZm9yICg7IGlkeCA+IDA7IGlkeCAtPSBpZHggJiAtaWR4KSB7CiAgICAgICAgc3VtICs9IHRyZWVbaWR4XTsKICAgIH0KICAgIHJldHVybiBzdW07Cn0KaW50IGZpbmRfa3RoX2ZyZWUoaW50IGspIHsKICAgIGludCBpZHggPSAwOwogICAgZm9yIChpbnQgaSA9IDEgPDwgMTY7IGkgPiAwOyBpID4+PSAxKSB7CiAgICAgICAgaWYgKGlkeCArIGkgPD0gdHJlZV9zaXplICYmIHRyZWVbaWR4ICsgaV0gPCBrKSB7CiAgICAgICAgICAgIGlkeCArPSBpOwogICAgICAgICAgICBrIC09IHRyZWVbaWR4XTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaWR4ICsgMTsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CgogICAgaW50IG47CiAgICBpZiAoIShjaW4gPj4gbikpIHJldHVybiAwOwogICAgdHJlZV9zaXplID0gbjsKICAgIHRyZWUuYXNzaWduKG4gKyAxLCAwKTsKICAgIHZlY3RvcjxpbnQ+IHJlc3VsdChuICsgMSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICB0cmVlX2FkZChpLCAxKTsKICAgIH0KICAgIGludCBjdXJyZW50X2ZyZWVfcmFuayA9IDA7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgaW50IGZyZWVfc2xvdHNfbGVmdCA9IG4gLSBpICsgMTsgCiAgICAgICAgY3VycmVudF9mcmVlX3JhbmsgPSAoY3VycmVudF9mcmVlX3JhbmsgKyBpKSAlIGZyZWVfc2xvdHNfbGVmdDsKCiAgICAgICAgaW50IHRhcmdldF9yYW5rID0gY3VycmVudF9mcmVlX3JhbmsgKyAxOwogICAgICAgIGludCBhY3R1YWxfcG9zID0gZmluZF9rdGhfZnJlZSh0YXJnZXRfcmFuayk7CiAgICAgICAgcmVzdWx0W2FjdHVhbF9wb3NdID0gaTsKICAgICAgICB0cmVlX2FkZChhY3R1YWxfcG9zLCAtMSk7CiAgICAgICAgY3VycmVudF9mcmVlX3JhbmsgPSB0YXJnZXRfcmFuayAtIDE7CiAgICB9CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICBjb3V0IDw8IHJlc3VsdFtpXSA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8ICJcbiI7CgogICAgcmV0dXJuIDA7Cn0=