原作者改题了 ...
以下回答不适用于改过的题 ...
解释一下题吧。这个就是要求将 1~n 填入长为 n 的数组 a 里,要求对任意 i , a[i] != i 。
这样的填写方式称作 derangement / 错位排序。
这个题是要求出对于某一个 n ,可能的错位排序的总数。我们将它记为 P(n) 的话,那么有:
P(n) = (n-1)*((P(n-1) + P(n-2))
P(1) = 0
P(2) = 1
可以搜索 derangement
拿掉一个(n),n-1 个的 derangement 里,n 与其中任何一个交换,得到一个合法的 n 个的 derangement 。这种一共有 (n-1) * P(n-1) 个。
此时,n != a[a[n]]
拿掉两个(n,k) ,剩下是 n-2 的 derangement 。最后 n 与 k 互换,得到一个合法的 n 的 derangement 。k 一共有 n-1 中可能 . 这种一共有 (n-1) * P(n-2) 个。
此时,n == a[a[n]]
两种情况没有重复。n 的 derangment 必然为两种情况之一。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…