题意:
求多少个 n n n 个数的排列 ,满足对于任意的 i ( 1 ≤ i ≤ n ) A i ≠ i i(1\le i\le n)\ A_i \neq i i(1≤i≤n) Ai=i。
分析:我们从 n = 2 n = 2 n=2 的情况入手,显然此时只有一种方案,为:
2 1 2\ \ 1 2 1
然后我们来递推 n = 3 n = 3 n=3 的情况:
显然, 3 3 3 不能放在第三个数的位置,而 1 1 1 和 2 2 2 都可以,所以我们考虑用 3 3 3 来替换 1 1 1 和 2 2 2,可以得到:
3 1 2 3\ \ 1\ \ 2 3 1 2
3 2 1 3\ \ 2\ \ 1 3 2 1
不难发现,上面的错排由 3 3 3 替换 2 2 2 得到,而下面的由 3 3 3 替换 1 1 1 得到。
然后我们来递推 n = 4 n = 4 n=4 的情况:
显然, 4 4 4 可以替换两种 n = 3 n = 3 n=3 的错排方式中的任意一个数,这时,一共有 3 × 2 = 6 3 \times 2 = 6 3×2=6 种错排方式。
同时我们注意到: 4 4 4 也可以来替换 1 2 3 1\ \ 2\ \ 3 1 2 3 这个非错排的任意一个数,然后再将剩下两个数进行错排,两个数进行错排的方式我们之前已经知道是 1 1 1 种,因此这种情况下一共有 3 × 1 = 3 3 \times 1 = 3 3×1=3 种错排方式。
需要注意的是:如果计算时将 4 4 4 来替换 1 3 2 1\ \ 3\ \ 2 1 3 2 这种非错排考虑在内,就会出现问题,因为这并非完全的非错排,在替换时不同的替换方式会导致不同的结果,计算过于复杂,因此我们不将其考虑在内。
那么不考虑这种非错排情况会不会导致我们漏情况呢?答案是否定的。原因比较复杂,我会尽可能解释详细:
首先我们来看这个并非完全错排的非错排:
1 3 2 1\ \ 3\ \ 2 1 3 2
显而易见, 1 1 1 出现在了非错排的位置上,而 2 2 2 和 3 3 3 则出现在了错排的位置上。
因此如果我们用 4 4 4 来替换 1 1 1,这个非错排就会变成一个这样的错排:
4 3 2 1 4\ \ 3\ \ 2\ \ 1 4 3 2 1
同时我们不难注意到: 4 4 4 替换 1 1 1 后 2 2 2 和 3 3 3 不需要再调换已经构成了错排,这与另一种需要调换 2 2 2 和 3 3 3 的情况重合了。
以下是刚才提到的另一种情况:
1 2 3 1\ \ 2\ \ 3 1 2 3
当我们用 4 4 4 去替换 1 1 1 时,形成的排列为 4 2 3 1 4\ \ 2\ \ 3\ \ 1 4 2 3 1,显然 2 2 2 和 3 3 3 需要进行调换,调换后的错排为:
4 3 2 1 4\ \ 3\ \ 2\ \ 1 4 3 2 1
显然,这与上面的情况是一样的。
那么我们回到刚才的 1 3 2 1\ \ 3\ \ 2 1 3 2 的排列,如果我们用 4 4 4 来替换 3 3 3 结果又会如何呢?
显然,替换后排列如下:
1 4 2 3 1\ \ 4\ \ 2\ \ 3 1 4 2 3
此时 1 1 1 需要与 2 2 2 交换位置,故此时的错排为:
2 4 1 3 2\ \ 4\ \ 1\ \ 3 2 4 1 3
注意到,因为 2 2 2 一定会和 1 1 1 交换位置,所以 1 3 2 1\ \ 3\ \ 2 1 3 2 的非错排就能转化成 2 3 1 2\ \ 3\ \ 1 2 3 1 的错排,而这个错排我们在之前已经考虑过了,所以此时也无需考虑。
而 4 4 4 替换 3 3 3 的情况显然与 4 4 4 替换 2 2 2 的情况同理,不再赘述。
因此我们可以初步总结: n = 4 n=4 n=4 时,可能的情况数为 n = 3 n=3 n=3 时的情况数乘 3 3 3 加上 n = 2 n=2 n=2 时的情况是乘 3 3 3。
那么我们来到 n = 5 n = 5 n=5 的情况,验证一下我们刚刚推理的规律是否依然奏效。
首先,显然 5 5 5 可以替换 n = 4 n = 4 n=4 时 9 9 9 种错排情况中任意一个数字,这时得到的错排有 4 × 9 = 36 4 \times 9 = 36 4×9=36 种。
然后我们考虑用 5 5 5 来替换 1 2 3 4 1\ \ 2\ \ 3\ \ 4 1 2 3 4 这个非错排。
显然 5 5 5 可以替换任意一个数字,而替换一个数字之后需要将剩下三个数字重新进行错排,我们知道三个数字进行错排的方式有 2 2 2 种,所以这时错排方式有 4 × 2 = 8 4 \times 2 = 8 4×2=8 种。
同理之前 n = 4 n = 4 n=4 时的情况,我们知道我们不需要再考虑形如 1 3 2 4 1\ \ 3\ \ 2\ \ 4 1 3 2 4 这种不完全不是错排的非错排的情况了。
因此 n = 5 n = 5 n=5 时错排方式总数为 4 × 9 + 4 × 2 = 44 4 \times 9 + 4 \times 2 = 44 4×9+4×2=44 种。
因此我们可以推理出一个结论,当 n = k n = k n=k 时,首先 n n n 可以替换 n = k − 1 n = k - 1 n=k−1 的错排中的每一个数字,这时有 ( k − 1 ) × f k − 1 (k - 1)\times f_{k-1} (k−1)×fk−1 种情况,而同时 n n n 也可以替换 1 , 2 , ⋯ , k − 1 1, 2, \cdots , k - 1 1,2,⋯,k−1 中的任意一个数,再对剩下 k − 2 k - 2 k−2 个数进行错排,共有 ( k − 1 ) × f k − 2 (k - 1)\times f_{k-2} (k−1)×fk−2 种情况。
因此递推关系为:
f n = ( n − 1 ) × ( f n − 1 + f n − 2 ) f_n = (n - 1) \times(f_{n - 1} + f_{n - 2}) fn=(n−1)×(fn−1+fn−2)
递推关系已经有了,那么代码就不难写了:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int f[21] = {0, 0, 1};
signed main()
{
cin >> n;
for(int i = 3; i <= n; i = i + 1)
f[i] = (i - 1) * (f[i - 1] + f[i - 2]);
cout << f[n];
return 0;
}
完美,撒花
✿✿ヽ(°▽°)ノ✿