错排问题:有多少个长度为n的排列满足对于所有的 1 < = i < = n 1<=i<=n 1<=i<=n, i ! = a i i!=a_{i} i!=ai。
递推式
f
[
1
]
=
0
,
f
[
2
]
=
1
f[1]=0,f[2]=1
f[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]表示 至少 有 i i i个位置不变的方案数
-
a
n
s
[
i
]
ans[i]
ans[i]表示有
i
i
i个位置不变的方案数
f [ i ] = C n i ⋅ ( n − i ) ! f[i]=C_{n}^{i}\cdot (n-i)! f[i]=Cni⋅(n−i)!
a n s [ i ] = f [ i ] − ∑ j = i + 1 n C j i ⋅ a n s [ 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
=
0
n
C
n
i
⋅
g
[
i
]
f[n]=\sum_{i=0}^{n}C_{n}^{i}\cdot g[i]
f[n]=i=0∑nCni⋅g[i]
g
[
n
]
=
∑
i
=
0
n
(
−
1
)
n
−
i
⋅
C
n
i
⋅
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相同,计算答案时稍有不同
a n s [ i ] = ∑ j = i n ( − 1 ) j − i C j i ⋅ 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 = i n C j i ⋅ a n s [ j ] f[i]=\sum_{j=i}^{n}C_{j}^{i}\cdot ans[j] f[i]=j=i∑nCji⋅ans[j]
a n s [ i ] = ∑ j = i n ( − 1 ) j − i C j i ⋅ 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]表示序列长度为 i i i时的错位排列个数
- 可以得到
n ! = ∑ i = 0 n C n i ⋅ f [ i ] n!=\sum_{i=0}^{n}C_{n}^{i}\cdot f[i] n!=i=0∑nCni⋅f[i] - 是否觉得和二项式反演公式很相似?
f [ n ] = ∑ i = 0 n ( − 1 ) n − i C n i ⋅ 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 = 0 n ( − 1 ) n − i n ! ( 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 = 0 n ( − 1 ) i i ! f[n]=n!\cdot \sum_{i=0}^{n}\frac{(-1)^{i}}{i!} f[n]=n!⋅i=0∑ni!(−1)i