题解:
举个例子比较好理解,比如1 2 3 4 5 ,6,7,8,1对应其序号+1,2对应8,于是7,8,分别对应1,7,剩下还有3,4,5,6注意到可以重复上述步骤,于是这是一个可行序列,于是可以得出结论,若n%4==0则按上述规则是可行的,若n%4==1,则可以证明是可行的,其余数不可以
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int flag[100010];
memset(flag,0,sizeof(flag));
int n;
scanf("%d",&n);
if(n%4==3||n%4==2)
{
printf("-1\n");
return 0;
}
int cnt=n/4;
for(int i=1,j=1;i<=cnt;i++,j+=2)
{
flag[j]=j+1;
flag[j+1]=n-j+1;
flag[n-j+1]=n+1-flag[j];
flag[n-j]=n+1-flag[j+1];
}
if(n%4==1)
flag[n/2+1]=n/2+1;
for(int i=1;i<=n;i++)
{
if(i==n)
printf("%d\n",flag[i]);
else
printf("%d ",flag[i]);
}
return 0;
}