[THUPC2022 初赛] 造计算机
这是一道很水的构造题
首先我们把一个置换拆分成若干个循环置换的乘积,例如:
讲一下怎么通过循环置换还原成原来那个:
这样的话,上面那一行表示下标,下面那一行表示对应位置上的数。
这道题经过简单分析我们可以发现 m=1 是不可能的,因此很自然而然地想到 m=2 就是答案。
因为每个环之间是独立的,所以我们分别分析。
先来看这个置换:
一个很自然的想法是按(3,2,1)即循环置换的顺序来操作,会很舒服地发现基本所有数都能归位,但最后一步却无论如何也执行不了。
经过简单分析我们发现原因在于 :
- 一个非寄存器的位置占据了原本寄存器的位置,导致原本的寄存器无法归位
- 另一个寄存器没有发挥用处
于是我的解决方案是:我们在做上述操作前,把这两个寄存器和非寄存器的位置先调换一下,然后再用另一个寄存器来操作。最后原来那个寄存器被调换了出来,而另一个寄存器则可以和 n+1 位置调换,也能被调换出来。
此时我们再回看原来的循环置换:
可以发现我完全就是在复制这个置换上的操作,只不过加了少量调整而已。而如果仔细观察的话,会发现我操作的位置其实就是这个循环置换的首尾,所以其实并不难寻找。
总结:这道题我主要是突然有了灵感,想到在循环置换的形式上做文章,最后得到了合适的构造方案。