CF286A Lucky Permutation
找规律
先盗张图
将数据分成4类:n%4==0 n%4==1 n%4==2 n%4==3
余数为0:
由图+分析题目意思可得
2 n ... 1 n-1 这样的排列最大化利用空间,使得这四个数字可以互相传递,答案不会出错
所以余数为0时只要这样即可
余数为1:
若x=(n/2)+1,p[p[x]]=x
证明:显然
则中间一个数字为x,其他就像余数为0时一样排列
余数为2、3:
由余数为0的证明可得,只有那样的四元组是最大化利用空间,使得互相不冲突的
反之,必然会冲突
那么余数为2和3时一定会有冲突
所以输出-1
代码:
#include<bits/stdc++.h> using namespace std; int n; int a[1000005]; int main(){ cin>>n; if(n%4!=0&&n%4!=1){ printf("-1\n"); return 0; } for(int i=1;i<n/2;i++,++i){ a[i]=i+1; a[i+1]=n-i+1; a[n-i+1]=n-i; a[n-i]=i; } if(n%2==1) a[(n/2)+1]=(n/2)+1; for(int i=1;i<=n;i++){ printf("%d ",a[i]); } printf("\n"); return 0; }