#include <cstdio>
#include <vector>
using namespace std;
int arbint[120005];
vector <int> sol;
void init(int nod, int st, int dr) {
arbint[nod] = dr - st + 1;
if(st < dr) {
int med = (st + dr) / 2;
init(2 * nod, st, med);
init(2 * nod + 1, med + 1, dr);
}
}
int ramasSt;
void sterg(int nod, int st, int dr, int ord) {
if(st == dr) {
sol.push_back(st);
arbint[nod] = 0;
} else if(st < dr) {
int med = (st + dr) / 2;
if(ramasSt + arbint[2 * nod] >= ord) {
sterg(2 * nod, st, med, ord);
} else {
ramasSt += arbint[2 * nod];
sterg(2 * nod + 1, med + 1, dr, ord);
}
arbint[nod] = arbint[2 * nod] + arbint[2 * nod + 1];
}
}
int ans = 0;
void querry(int nod, int st, int dr, int a, int b) {
if(a <= st && dr <= b) {
ans += arbint[nod];
} else if(st < dr) {
int med = (st + dr) / 2;
if(a <= med) {
querry(2 * nod, st, med, a, b);
}
if(med + 1 <= b) {
querry(2 * nod + 1, med + 1, dr, a, b);
}
}
}
int main() {
freopen("order.in", "r", stdin);
freopen("order.out", "w", stdout);
int n;
scanf("%d", &n);
init(1, 1, n);
sol.push_back(1);
for(int i = 1; i <= n; ++ i) {
ans = 0;
querry(1, 1, n, 1, sol[i - 1]);
int ord = (ans + i) % (n - i + 1);
if(ord == 0) {
ord += (n - i + 1);
}
ramasSt = 0;
sterg(1, 1, n, ord);
}
for(int i = 1; i <= n; ++ i) {
printf("%d ", sol[i]);
}
return 0;
}