AT4119-[ARC096C]Everything on It【斯特林数,容斥】
正題
題目鏈接:https://www.luogu.com.cn/problem/AT4119
題目大意
一個集合S={k∈[1,n]∪N}S=\{k\in[1,n]\cup N\}S={k∈[1,n]∪N},它的所有子集作為元素組成的集合中要求滿足每一個數字的出現之和不小于222,求方案數對PPP取模。
1≤n≤3000,P∈[108,109+9]∪Pri1\leq n\leq 3000,P\in[10^8,10^{9}+9]\cup Pri1≤n≤3000,P∈[108,109+9]∪Pri
解題思路
考慮至少iii個數選擇次數不超過111,那么這個方案的容斥系數就是(?1)i(-1)^i(?1)i。
考慮怎么求這個方案,我們可以先不要被限制了的數,然后再將這些被限制了的數丟進被選出了的集合中。設有jjj個集合包含被限制了的數,那么丟進這些集合的方案就是{i+1j+1}\begin{Bmatrix} i+1\\j+1 \end{Bmatrix}{i+1j+1?}(一個數字可以選擇不丟所以開一個新的集合表示這個集合內的數不使用),然后剩下的數隨意的選入這些集合中就是(2n?i)j(2^{n-i})^j(2n?i)j。
那么答案出來了
∑i=0n(?1)i22n?i(ni)∑j=0i{i+1j+1}(2n?i)j\sum_{i=0}^n(-1)^i2^{2^{n-i}}\binom{n}{i}\sum_{j=0}^i\begin{Bmatrix}i+1\\ j+1\end{Bmatrix}(2^{n-i})^ji=0∑n?(?1)i22n?i(in?)j=0∑i?{i+1j+1?}(2n?i)j
直接預處理斯特林數計算就好了,時間復雜度O(n2)O(n^2)O(n2)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=3100; ll n,P,s[N][N],fac[N],ans; ll power(ll x,ll b,ll p=P){ll ans=1;while(b){if(b&1)ans=ans*x%p;x=x*x%p;b>>=1;}return ans; } ll C(ll n,ll m) {return fac[n]*power(fac[m],P-2)%P*power(fac[n-m],P-2)%P;} signed main() {scanf("%lld%lld",&n,&P);s[0][0]=fac[0]=1;for(ll i=1;i<=n;i++)fac[i]=fac[i-1]*i%P;for(ll i=1;i<=n+1;i++)for(ll j=1;j<=i;j++)s[i][j]=(s[i-1][j-1]+j*s[i-1][j]%P)%P;for(ll i=0;i<=n;i++){ll sum=0,tmp=power(2,power(2,n-i,P-1));if(i&1)tmp=P-tmp;tmp=tmp*C(n,i)%P;for(ll j=0,z=1,p=power(2,n-i);j<=i;j++,z=z*p%P)(sum+=s[i+1][j+1]*z%P)%=P;(ans+=sum*tmp)%=P;}printf("%lld\n",ans);return 0; }總結
以上是生活随笔為你收集整理的AT4119-[ARC096C]Everything on It【斯特林数,容斥】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内置中枢网关 + 全 2.5G 口:小米
- 下一篇: CF932G-Palindrome Pa