https://ac.nowcoder.com/acm/contest/7745/C
真的第一次这么认真的考虑容斥定理,这个题我只相对了一半。
假如他给了3个p 2 4 6,那就求出 只有 12开头的排列数量f[2],只有1234开头不包含12开头的f[4],只有123456开头不包含12和1234开头的排列数量f[6];
动态规划的方法容斥,可以的。具体看代码把
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
int n,m;
const int maxn = 2e5+11;
ll list[maxn];
ll mod = 20000311;
ll ans[maxn];
ll f[maxn];
int main(){
list[0] =1;
for(int i=1;i<maxn;i++){
list[i] = (list[i-1]*i)%mod;
}
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>ans[i];
}
sort(ans,ans+m);
for(int i=0;i<m;i++){
f[i] = (list[ans[i]])%mod;
}
ll cns = list[n];
for(int i=0;i<m;i++){
for(int j=0;j<i;j++){
f[i] = (f[i] - f[j]*list[ans[i] - ans[j]]%mod + mod)%mod;
}
cns = (cns - f[i]*list[n - ans[i]]%mod + mod)%mod;
}
cout<<cns<<endl;
return 0;
}