P6620 [省选联考 2020 A 卷] 组合数问题(斯特林数、下降幂)
解析
給出 n,x,pn,x,pn,x,p 和一個 mmm 次的多項式 f(k)f(k)f(k),求解:
∑k=0nf(k)xk(nk)modp\sum_{k=0}^nf(k)x^k\binom n k\mod pk=0∑n?f(k)xk(kn?)modp
把多項式拆成若干個單項式,現在就是要求:
∑k=0nkpxk(nk)\sum_{k=0}^nk^px^k\binom n kk=0∑n?kpxk(kn?)
直接拆階乘,可以得到:
(nk)k=n(n?1k?1)\binom n kk=n\binom {n-1}{k-1}(kn?)k=n(k?1n?1?)
嘗試把 kpk^pkp 揉進組合數:
(nk)k=n(n?1k?1)\binom n k k=n\binom {n-1}{k-1}(kn?)k=n(k?1n?1?)
(nk)k2=kn(n?1k?1)=n(n?1)(n?2k?2)+n(n?1k?1)\binom n k k^2=kn\binom {n-1}{k-1}=n(n-1)\binom{n-2}{k-2}+n\binom{n-1}{k-1}(kn?)k2=kn(k?1n?1?)=n(n?1)(k?2n?2?)+n(k?1n?1?)
(nk)k3=k(n(n?1)(n?2k?2)+n(n?1k?1))\binom n k k^3=k(n(n-1)\binom{n-2}{k-2}+n\binom{n-1}{k-1})(kn?)k3=k(n(n?1)(k?2n?2?)+n(k?1n?1?))
=n(n?1)(n?2)(n?3k?3)+2n(n?1)(n?2k?2)+n(n?1)(n?2k?2)+n(n?1k?1)=n(n-1)(n-2)\binom{n-3}{k-3}+2n(n-1)\binom{n-2}{k-2}+n(n-1)\binom{n-2}{k-2}+n\binom{n-1}{k-1}=n(n?1)(n?2)(k?3n?3?)+2n(n?1)(k?2n?2?)+n(n?1)(k?2n?2?)+n(k?1n?1?)
=n(n?1)(n?2)(n?3k?3)+3n(n?1)(n?2k?2)+n(n?1k?1)=n(n-1)(n-2)\binom{n-3}{k-3}+3n(n-1)\binom{n-2}{k-2}+n\binom{n-1}{k-1}=n(n?1)(n?2)(k?3n?3?)+3n(n?1)(k?2n?2?)+n(k?1n?1?)
歸納以下,可以有:
(nk)kp=∑i=1pni ̄(n?ik?i)s(p,i)\binom n k k^p=\sum_{i=1}^pn^{\underline i}\binom {n-i}{k-i}s(p,i)(kn?)kp=i=1∑p?ni?(k?in?i?)s(p,i)
其中 s(p,i)s(p,i)s(p,i) 為轉移系數。
考慮這個轉移系數怎么來的,它可以從 p?1p-1p?1 行的 s(p?1,i)s(p-1,i)s(p?1,i) 的 kkk 拆出一個 (k?i),i(k-i),i(k?i),i 時得到 i?s(p?1,i)i*s(p-1,i)i?s(p?1,i),也可以從 s(p?1,i?1)s(p-1,i-1)s(p?1,i?1) 升一個上來,所以有:
s(p,i)=i?s(p?1,i)+s(p?1,i?1)s(p,i)=i*s(p-1,i)+s(p-1,i-1)s(p,i)=i?s(p?1,i)+s(p?1,i?1)
邊界為:s(1,1)=1s(1,1)=1s(1,1)=1。
注意到,這個東西其實就是第二類斯特林數。
那么我們接著推:
∑k=0nkpxk(nk)=∑k=0nxk∑i=1pni ̄(n?ik?i)s(p,i)=∑i=1pni ̄s(p,i)∑k=inxk(n?ik?i)\sum_{k=0}^nk^px^k\binom n k=\sum_{k=0}^nx^k\sum_{i=1}^pn^{\underline i}\binom {n-i}{k-i}s(p,i)=\sum_{i=1}^pn^{\underline i}s(p,i)\sum_{k=i}^nx^k\binom {n-i}{k-i}k=0∑n?kpxk(kn?)=k=0∑n?xki=1∑p?ni?(k?in?i?)s(p,i)=i=1∑p?ni?s(p,i)k=i∑n?xk(k?in?i?)
=∑i=1pni ̄s(p,i)xi∑k=0n?ixk(n?ik)=∑i=1pni ̄s(p,i)xi(1+x)n?i=\sum_{i=1}^pn^{\underline i}s(p,i)x^i\sum_{k=0}^{n-i}x^k\binom {n-i}{k}=\sum_{i=1}^pn^{\underline i}s(p,i)x^i(1+x)^{n-i}=i=1∑p?ni?s(p,i)xik=0∑n?i?xk(kn?i?)=i=1∑p?ni?s(p,i)xi(1+x)n?i
帶回到最初的式子:(注意前面的式子需要 p≥1p\ge 1p≥1,所以常數項單獨算)
ans=∑p=1map∑i=1pni ̄s(p,i)xi(1+x)n?i+a0(1+x)nans=\sum_{p=1}^ma_p\sum_{i=1}^pn^{\underline i}s(p,i)x^i(1+x)^{n-i}+a_0(1+x)^nans=p=1∑m?ap?i=1∑p?ni?s(p,i)xi(1+x)n?i+a0?(1+x)n
=∑i=1mxi(1+x)n?ini ̄∑p=imaps(p,i)=\sum_{i=1}^mx^i(1+x)^{n-i}n^{\underline i}\sum_{p=i}^ma_ps(p,i)=i=1∑m?xi(1+x)n?ini?p=i∑m?ap?s(p,i)
總復雜度 O(m(m+log?n))O(m(m+\log n))O(m(m+logn))
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) #define ok debug("OK\n") using namespace std;const int N=1050; const int inf=1e9; int mod;inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res; }int n,m,x; ll s[N][N],a[N];signed main() { #ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout); #endifn=read();x=read();mod=read();m=read();for(int i=0;i<=m;i++) a[i]=read();ll ans=a[0]*ksm(x+1,n)%mod;s[0][0]=1;for(int i=1;i<=m;i++){for(int j=1;j<=i;j++) s[i][j]=(j*s[i-1][j]+s[i-1][j-1])%mod;}for(int j=1;j<=m;j++){ll bas=ksm(x,j)*ksm(x+1,n-j)%mod;for(int i=1;i<=j;i++) bas=bas*(n-i+1)%mod;//ll res(0);for(int i=j;i<=m;i++) (ans+=bas*s[i][j]%mod*a[i])%=mod;}printf("%lld\n",ans);return 0; } /* */總結
以上是生活随笔為你收集整理的P6620 [省选联考 2020 A 卷] 组合数问题(斯特林数、下降幂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 土豪的电脑配置高吗(土豪的电脑配置)
- 下一篇: 模板:矩阵树定理