错排问题:有多少个长度为n的排列满足对于所有的1<=i<=n1<=i<=n1<=i<=n,i!=aii!=a_{i}i!=ai。
递推式
f[1]=0,f[2]=1f[1]=0,f[2]=1f[1]=0,f[2]=1
f[i]=(n−1)⋅(f[i−1]+f[i−2])f[i]=(n-1)\cdot(f[i-1]+f[i-2])f[i]=(n−1)⋅(f[i−1]+f[i−2])
容斥1
- f[i]f[i]f[i]表示 至少 有iii个位置不变的方案数
- ans[i]ans[i]ans[i]表示有iii个位置不变的方案数
f[i]=Cni⋅(n−i)!f[i]=C_{n}^{i}\cdot (n-i)!f[i]=Cni⋅(n−i)!
ans[i]=f[i]−∑j=i+1nCji⋅ans[j]ans[i]=f[i]-\sum_{j=i+1}^{n}C_{j}^{i}\cdot ans[j]ans[i]=f[i]−j=i+1∑nCji⋅ans[j]
二项式反演
f[n]=∑i=0nCni⋅g[i]f[n]=\sum_{i=0}^{n}C_{n}^{i}\cdot g[i]f[n]=i=0∑nCni⋅g[i]
g[n]=∑i=0n(−1)n−i⋅Cni⋅f[i]g[n]=\sum_{i=0}^{n}(-1)^{n-i}\cdot C_{n}^{i}\cdot f[i]g[n]=i=0∑n(−1)n−i⋅Cni⋅f[i]
容斥2
- 两个辅助数组和容斥1相同,计算答案时稍有不同
ans[i]=∑j=in(−1)j−iCji⋅f[j]ans[i]=\sum_{j=i}^{n}(-1)^{j-i}C_{j}^{i}\cdot f[j]ans[i]=j=i∑n(−1)j−iCji⋅f[j] - 如何推得此式,考虑二项式反演
f[i]=∑j=inCji⋅ans[j]f[i]=\sum_{j=i}^{n}C_{j}^{i}\cdot ans[j]f[i]=j=i∑nCji⋅ans[j]
ans[i]=∑j=in(−1)j−iCji⋅f[j]ans[i]=\sum_{j=i}^{n}(-1)^{j-i}C_{j}^{i}\cdot f[j]ans[i]=j=i∑n(−1)j−iCji⋅f[j]
容斥3
- f[i]f[i]f[i]表示序列长度为iii时的错位排列个数
- 可以得到
n!=∑i=0nCni⋅f[i]n!=\sum_{i=0}^{n}C_{n}^{i}\cdot f[i]n!=i=0∑nCni⋅f[i] - 是否觉得和二项式反演公式很相似?
f[n]=∑i=0n(−1)n−iCni⋅i!f[n]=\sum_{i=0}^{n}(-1)^{n-i}C_{n}^{i}\cdot i!f[n]=i=0∑n(−1)n−iCni⋅i!
f[n]=∑i=0n(−1)n−in!(n−i)!f[n]=\sum_{i=0}^{n}(-1)^{n-i}\frac{n!}{(n-i)!}f[n]=i=0∑n(−1)n−i(n−i)!n!
f[n]=n!⋅∑i=0n(−1)ii!f[n]=n!\cdot \sum_{i=0}^{n}\frac{(-1)^{i}}{i!}f[n]=n!⋅i=0∑ni!(−1)i