一道题目

Posted on 2025-04-25 18:21  K_J_M  阅读(29)  评论(0)    收藏  举报

一道题目

给定正整数 \(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-循环}\) 的会多减一次,下次我们就需要加上。总的来说我们的式子为

\[g_n+\sum_{i=1}^{\lfloor \frac{n}{3} \rfloor}(-1)^i\frac{n!}{i!\times 3^i\times (n-3i)!}\times g_{n-3i} \]

时间复杂度 \(\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}\)。将每一种情况进行求和可以得到

\[a_n=(n-1)a_{n-2}+\sum_{k=4}^{n}{n-1 \choose k-1}\times (k-1)! \times a_{n-k} \]

但是这样做的时间复杂度为 \(\mathcal O(n^2)\),我们显然还可以做到更优。

将上面的式子化一下简可以得到

\[a_n=(n-1)a_{n-2}+(n-1)!\sum_{i=0}^{n-4}\frac{a_i}{i!} \]

写出 \(a_{n-1}\)

\[a_{n-1}=(n-2)a_{n-3}+(n-2)!\sum_{i=0}^{n-5}\frac{a_i}{i!} \]

发现

\[(n-1)!\sum_{i=0}^{n-4}\frac{a_i}{i!}=(n-1)\times \{(n-2)!\sum_{i=0}^{n-5}\frac{a_i}{i!}\}+(n-1)!\times \frac{a_{n-4}}{(n-4)!} \]

所以

\[a_n=(n-1)\times [a_{n-1}-(n-2)a_{n-3}]+(n-1)!\times \frac{a_{n-4}}{(n-4)!} \]

化简一下可以得到

\[a_n=(n-1)(a_{n-1}+a_{n-2}-(n-2)a_{n-3}+(n-2)(n-3)a_{n-4}) \]

这样我们的时间复杂度就做到了 \(\mathcal O(n)\)

后续

此题是蒟蒻校模拟赛的 T2,蒟蒻当时只写了 \(n\le 12\) 的暴力分。赛后想推一下式子,但是无果。于是乎蒟蒻便将此题给本校数学超强的 fsy 解答,也无果,于是又给本校的数学竞赛班老师 zyz 进行解答,也无果,于是只好蒟蒻自己推式子了。推了很久终于推出来 \(n^2\) 式子,进行验证发现非常正确,于是报告教练。但教练用容斥推出上面的 \(\mathcal O(n)\) 式子,蒟蒻于是重新对式子进行思考,发现可以数学做到 \(\mathcal O(n)\),最后就有了这两种不同方法。但我们还对该题进行发帖,发现网上大神 10min 就用一种我们看不懂的方法迅速而又正确的解答了这个问题,瞠目结舌。于是这道题目经过两周的思考,最终思想荟萃。