1-1 错排问题

题意:

求多少个 n n n 个数的排列 ,满足对于任意的 i ( 1 ≤ i ≤ n )   A i ≠ i i(1\le i\le n)\ A_i \neq i i(1in) 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=k1 的错排中的每一个数字,这时有 ( k − 1 ) × f k − 1 (k - 1)\times f_{k-1} (k1)×fk1 种情况,而同时 n n n 也可以替换 1 , 2 , ⋯   , k − 1 1, 2, \cdots , k - 1 1,2,,k1 中的任意一个数,再对剩下 k − 2 k - 2 k2 个数进行错排,共有 ( k − 1 ) × f k − 2 (k - 1)\times f_{k-2} (k1)×fk2 种情况。

因此递推关系为:

f n = ( n − 1 ) × ( f n − 1 + f n − 2 ) f_n = (n - 1) \times(f_{n - 1} + f_{n - 2}) fn=(n1)×(fn1+fn2)

递推关系已经有了,那么代码就不难写了:

#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;
}

完美,撒花

✿✿ヽ(°▽°)ノ✿

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值