#include<cstdio>
using namespace std;
const int nmax=(1e5+5);
int arb[nmax<<2],ans=1,last,l,r,poz;
inline void buildtree(int node,int st,int dr)
{
if(st==dr)
{
arb[node]=1;
return;
}
int med=((dr-st)>>1) +st;
buildtree(node<<1,st,med);
buildtree(node<<1|1,med+1,dr);
arb[node]=arb[node<<1] + arb[node<<1|1];
}
inline void query1(int node,int st,int dr)
{
if(l <= st && dr <= r)
{
last+=arb[node];
return;
}
if(st == dr)
return;
int med=((dr-st)>>1)+st;
if(med>=l)
query1(node<<1 ,st , med);
if(r>med)
query1(node<<1|1,med+1,dr);
}
inline void query(int node,int st,int dr)
{
if(st==dr)
{
ans=st;
arb[node]=0;
return;
}
int med=((dr-st)>>1)+st;
if(arb[node<<1] >= poz)
query(node<<1 , st ,med);
else
poz-=arb[node<<1],query(node<<1|1 , med+1 ,dr );
arb[node]=arb[node<<1] + arb[node<<1|1];
}
int main()
{
freopen("order.in","r",stdin);
freopen("order.out","w",stdout);
int n,i,j,lng;
scanf("%d",&n);
buildtree(1 , 1 ,n);
lng=n;
for(i=1;lng>0;i++,lng--)
{
l=1,r=ans;
last=0;
query1(1 , 1 , n);
poz=last+i;
while(poz > lng)
poz-=lng;
query(1 , 1 , n);
printf("%d ",ans);
}
}