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; }
CF286A Lucky Permutation 解题报告
本文详细解析了 CF286A Lucky Permutation 的解题思路,针对不同 n%4 的情况给出了具体的算法实现。当 n 被 4 整除或除以 4 余 1 时,可以通过特定排列得到正确的幸运排列;而当余数为 2 或 3 时,则无法构造出满足条件的排列。
749

被折叠的 条评论
为什么被折叠?



