【牛客】数学考试(dp)

90nwyn

2020-10-24 12:29:21

Personal

[题目链接](https://ac.nowcoder.com/acm/contest/7745/C) ------------ 令$p_{m+1}=n$,对$p$从小到大排序 $dp[i]$为前$i-1$个条件都满足,第$i$个条件不满足的方案数 $dp[i]=p_i!-\sum_{j=1}^{i-1}(p_i-p_j)! dp[j]$ ------------ ```cpp #include <bits/stdc++.h> using namespace std; typedef long long ll; const int M=1e3+5,mod=20000311; int n,m,p[M],dp[M],fac[M]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++)scanf("%d",&p[i]); p[++m]=n; sort(p+1,p+1+m); fac[0]=1; for(int i=1;i<=n;i++)fac[i]=(ll)fac[i-1]*i%mod; for(int i=1;i<=m;i++) { dp[i]=fac[p[i]]; for(int j=1;j<i;j++) dp[i]=(dp[i]-(ll)fac[p[i]-p[j]]*dp[j]%mod+mod)%mod; } printf("%d\n",dp[m]); return 0; } ```