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; }