首先可以观察得到两个结论:
- 交换两个操作的操作顺序不会影响操作序列是否合法。
显然是正确的,模拟一下即可。
- 任意操作序列无法使序列变回原本的序列。
考虑最长的操作和别的所有的操作,区间长度不相同,因此一定有元素被 swap 了。
以上两点告诉我们,答案只有一种,只需要求出操作数量然后阶乘即可。
因为第一个结论的存在所以我们可以从操作长度从小往大考虑。
考虑正在执行第 \(i\) 次操作,将序列划分为 \(2^{n-i+1}\) 段后,若满足段内元素 \(\gcd(|k-p[k]|)=2^{i-1}\) 的段的数量不为 \(2\) 则一定无解(后面的操作无法改变多余的段,如果只有一段则交换操作无效),否则交换这两段即可。
复杂度 \(O(n\log n)\)。
标签:交换,即可,长度,序列,操作,考虑,LGP3322 来源: https://www.cnblogs.com/lmpp/p/16516180.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。
