一道题目
给定正整数 \(n \le 1000\),求出不满足下面任意条件的排列的个数:
- \(p_i=i\)
- \(p_i=j,p_j=k,p_k=i\)
其中 \(i,j,k \in [1,n]\) 且互异。
Solution
讲下面两个方法时首先声明定义:
\(\text{n-循环}\) 是指一个 \(1\sim n\) 的排列在经过任意排列转化之后得到的排列。
容斥
首先上面的条件就等价于排列中没有 \(\text{1-循环}\) 和 \(\text{3-循环}\) 的个数,也可以等于错排的数量减去至少含有一个 \(\text{3-循环}\) 的错排个数。首先错排的数量记为 \(g_n\),则 \(g_n=(n-1)\times(g_{n-1}+g_{n-2})\)。现在要去掉至少一个 \(\text{3-循环}\) 的错排,考虑选出三个数 $n \choose {3} $ 种选法,然后有效的排列只有两个,现在我们已经固定了一个 \(\text{3-循环}\),然后其他的 \(n-3\) 个数可以构成 \(g_{n-3}\) 个排列。但是这 \(g_{n-3}\) 种中也包含了一些 \(\text{3-循环}\),我们在选择一个 \(\text{3-循环}\) 时,\(g_{n-3}\) 个排列中也会有 \(\text{3-循环}\),我们下次在计算另一个 \(\text{3-循环}\) 时会重复,所以我们需要通过容斥去掉重复。第一次选择一个 \(\text{3-循环}\) 时,至少有两个 \(\text{3-循环}\) 的会多减一次,下次我们就需要加上。总的来说我们的式子为
时间复杂度 \(\mathcal O(n)\)。
组合
按照排列中没有 \(\text{1-循环}\) 和 \(\text{3-循环}\) 的个数的思路去乱搞。
首先我们需要求出只有 \(\text{n-循环}\) 的排列个数,设 \(n\) 排列的 \(\text{n-循环}\) 个数为 \(h_n\)。我们发现 \(1\) 位置上只能填 \(2\sim n\) 中的一个,共 \(n-1\) 种,设填 \(x\),则 \(x\) 位置上只能填除了 \(x,1\) 的其他数,因为为了保证只有 \(\text{n-循环}\),而 \(x\) 位置上填 \(1\) 就会出现 \(\text{2-循环}\)。这样一直推下去就会发现 \(h_n=(n-1)!\)。
有了这个基础后我们就够推出式子了。
设答案为\(a_n\),假设当前我们考虑到第 \(n\) 项,那么这一项只能位于 \(2,4,5\dots\) 循环,当位于 \(k\) 循环时,我们可以从前面 \(n-1\) 个数中选出 \(k-1\) 个数,然后这 \(k-1\) 个数和 \(n\) 构成 \(k\) 个数,然后构成的只是 \(\text{k-循环}\) 的有 \((k-1)!\) 种方法,最后还有剩下的 \(n-k\) 个数的答案 \(a_{n-k}\)。将每一种情况进行求和可以得到
但是这样做的时间复杂度为 \(\mathcal O(n^2)\),我们显然还可以做到更优。
将上面的式子化一下简可以得到
写出 \(a_{n-1}\)
发现
所以
化简一下可以得到
这样我们的时间复杂度就做到了 \(\mathcal O(n)\)。
后续
此题是蒟蒻校模拟赛的 T2,蒟蒻当时只写了 \(n\le 12\) 的暴力分。赛后想推一下式子,但是无果。于是乎蒟蒻便将此题给本校数学超强的 fsy 解答,也无果,于是又给本校的数学竞赛班老师 zyz 进行解答,也无果,于是只好蒟蒻自己推式子了。推了很久终于推出来 \(n^2\) 式子,进行验证发现非常正确,于是报告教练。但教练用容斥推出上面的 \(\mathcal O(n)\) 式子,蒟蒻于是重新对式子进行思考,发现可以数学做到 \(\mathcal O(n)\),最后就有了这两种不同方法。但我们还对该题进行发帖,发现网上大神 10min 就用一种我们看不懂的方法迅速而又正确的解答了这个问题,瞠目结舌。于是这道题目经过两周的思考,最终思想荟萃。
浙公网安备 33010602011771号