c++:数串的排列。

描述
前N个自然数排成一串:x1,x2,x3…Xn。先取出x1,将x2,x3移到数串尾,
再取出x4,将x5,x6移到数串尾,...类推直至取完,取出的序列恰好是:1,2,3...... N。要求输入N,求原来数串的排列方式。
输入格式 
只有一个数为N(N≤100)。
输出格式 
只有一行,为原来数串的排列方式。
样例输入 
5
样例输出 
1 5 3 2 4

int n,p=0,q,a[305]={},b[105]={};
cin>>n;
q=n;
for(int i=1;i<=n;i++)
{
    a[i]=i;
}
for(int i=1;i<=n;i++)
{
    b[i]=a[++p];
    a[++q]=a[++p];
    a[++q]=a[++p];
}
for(int i=1;i<=n;i++)
{
    a[b[i]]=i;
}
for(int i=1;i<=n;i++)
{
    cout<<a[i]<<" ";
}

解释一下

我这个思路清奇(主要因为开始没看清题)(反向推理一波)

首先模拟一遍,假设原序列为{1,2,3,...}

p标记队头的位置,q标记队尾的位置

b为输出序列

若输出应该是b_real{1,2,3,...},则b中的第n个元素k应该为n

那么a中的第k个元素(原本是k)应该改成n

操作完的a就是原来应该为的数列,输出就好