错排小记
错排好像可以在求解组合问题时突然蹦出来,那要是不会就 GG 了啊,那就记下板子吧。
错排的定义
考虑
显然:
分类讨论:
综上:
容斥
定义性质
有
前半部分:
考虑容斥求解后半部分:
显然
(面对不关心
上式带入上上式:
最后回到开始的式子:
也可以写成:
代码
两种都放上。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5, mod = 1e9 + 7;
int n, ans, jc[N], jcinv[N], awa[N];
inline int qstp(int a, int b) {int s = 1; for(; b;a = a * a % mod, b >>= 1) if(b & 1) s = s * a % mod; return s;}
inline int C(int n, int m) {return jc[n] * jcinv[m] % mod * jcinv[n - m] % mod;}
signed main(){
jc[0] = jcinv[0] = awa[0] = 1;
for(int i = 1; i <= 1e6;++i){
jcinv[i] = qstp(jc[i] = jc[i - 1] * i % mod, mod - 2);
awa[i] = i == 1 ? 0 : (awa[i - 1] + awa[i - 2]) * (i - 1) % mod;
}
cin >> n;
for(int i = 0, p = 1; i <= n;++i, p *= -1){
ans = ((ans + p * C(n, i) % mod * jc[n - i] % mod) % mod + mod) % mod;
}
cout << ans << "\n" << awa[n];
return 0;
}