错排递推式推导

今天听课讲容斥,提到错排,突然发现错排公式什么的好像已经忘了233

努力地回忆了一下,算出前几项,终于还原出了那个递推式↓

f(n)=(n-1)*(f(n-1)+f(n-2))

根据人赢的教导,只要思(yi)考(yin)下错排的构造就能记住了

然后就认(meng)认(you)真(yi)真(yang)地思(yi)考(yin)了下

用自己的理解把这玩意儿整理了一下↓

先加一点平时我们说的错排通常是指1~n,f(i)≠i,

其实脑补一下,它也可以看成A,B两个集合,|A|=|B|,对于每一个Ai,都对应唯一Bi,不同Ai对应Bi不同,现在强行改变对应方式,仍然是一对一,但是每一个Ai对应的Bi都不再是之前那个Bi,问方案数。

假设要构造f(n),

首先,必须满足f(n)≠n,则第n位只能取1~n-1,且第n位取1~n-1的任何一个数都是等价的

令g(n)为前n位排好的方案数.

那么f(n)=g(n-1)*(n-1),

因为此时前n-1位数字不是1~n-1,而是1~n中除去任意x(x∈[1,n-1])的方案数,所以显然g(n-1)≠f(n-1)

对于没一个k(k属于[1,n-1])

存在前n-1位的构造根据第n个的摆放可以分成两种情况:

1) n放在第k位,k放在第n位,剩下n-2的数满足n-2的错排,方案数为f(n-2)

2) n不放在第k位,那么剩下n-1的数满足n-1的错排,方案数为f(n-1)

要满足两种情况不重复,就必须满足1~n-1的任意一种错排方案的前n-2个数的排列一定不等于任意一种1~n-2的错排方案

(很绕的一句话,不过显然是对的,因为假设存在相等,那么第n-1位只能放n-1,不满足错排

所以g(n-1)=f(n-1)+f(n-2)

f(n)=(f(n-1)+f(n-2))*(n-1)

所以就证好了

其中初值还是很容易确定的,因为肯定要结合实际意义的嘛

f(0)=1   不放

f(1)=0   只有一个数,一个位置,显然不成立

错排公式的原型长这样→f(n)=n![1/0!-1/1!+1/2!-1/3!+1/4!+...+(-1)^n/n!],可以通过容斥,递推式各种方法求,这里就不证了ww

【写的有漏洞的,欢迎路过大神吐槽】

2016-08-06 16:48:00

Ending.

时间: 2024-10-15 19:02:59

错排递推式推导的相关文章

不容易系列之一(hdu1465)错排+递推

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16646 Accepted Submission(s): 6935 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样.话

递推式转化为矩阵形式

EXAMPLE: 递推式: d(n + 2) = p * d(n + 1) + (1 - p) * d(n); 令G(n) = (d(n + 2), d(n + 1))^T; 则 G(n + 1) = M * G(n); 解得 M = p   1 - p 1    0 G(n) = (M ^ n) * G(0); #

hiho 1143 矩阵快速幂 求递推式

题目链接: hihocoder 1143 思路见题目上 快速幂模板: // m^n % k int quickpow(int m,int n,int k) { int b = 1; while (n > 0) { if (n & 1) b = (b*m)%k; n = n >> 1 ; m = (m*m)%k; } return b; } 题解: #include<iostream> #include<cstdio> #include<cstring

51nod1149 Pi的递推式

基准时间限制:1 秒 空间限制:131072 KB 分值: 640 F(x) = 1 (0 <= x < 4) F(x) = F(x - 1) + F(x - pi) (4 <= x) Pi = 3.1415926535..... 现在给出一个N,求F(N).由于结果巨大,只输出Mod 10^9 + 7的结果即可. Input 输入一个整数N(1 <= N <= 10^6) Output 输出F(N) Mod 10^9 + 7 Input示例 5 Output示例 3 数学问

Python的递推式构造列表(List comprehension)

介绍 我们在上一章学习了“Lambda 操作, Filter, Reduce 和 Map”, 但相对于map, filter, reduce 和lamdba, Guido van Rossum更喜欢用递推式构造列表(List comprehension).在这一章我们将会涵盖递推式构造列表(List comprehension)的基础功能. 递推式构造列表(List comprehension)是在Python 2.0中添加进来的.本质上,它是一种数学家用来实现众所周知标记集合的Python方式

一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式

是斐波那契数列问题 假设f(n)是n个台阶跳的次数:(假设已经调到第n个台阶,最后一次是由哪个台阶跳上来的) f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) == f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) == f(n) = 2*f(n-1) 所以,可以得出递推式: 1 public static int jumpFloor(int n) { 2 if (n <= 0) 3 return 0; 4

【HDU4990】递推式

题目大意:给定序列 1, 2, 5, 10, 21, 42, 85, 170, 341 …… 求第n项 模 m的结果 递推式 f[i]  = f[i - 2] + 2 ^ (i - 1); 方法一: 构造矩阵, 求递推式 方法二: 直接推公式,递推式求和,得到 f[n] = [2 ^ (n + 1) - 1] / 3 奇数, f[n] = [2 ^ (n + 1) - 2] / 3 偶数: 其实还可以进一步化简, 注意到 2 ^ 2k % 3 = 1, 2 ^ (2k + 1) % 3 = 2,

hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)

题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10) 同时ai(0<=i<=9) 不是 0 就是 1: 现在给你 ai 的数字,以及k和mod,请你算出 f(x)%mod 的结果是多少 思路:线性递推关系是组合计数中常用的一种递推关系,如果直接利用递推式,需要很长的时间才能计算得出,时间无法承受,但是现在我们已知

矩阵乘法来加速递推式计算

Codevs1281: 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn 计算递推式,运用矩阵来进行计算加速 然后注意用类似快速幂的方法写一个快速加,避免溢出 怎么把式子化成矩阵,日后再补 1 #include<cstdio> 2 long long mod,a,c,x0,n,g; 3 struct Mat 4 { 5 long long m[2][2]; 6 }base,X0; 7 long long quick_add(long lo