P4640-[BJWC2008]王之财宝【OGF,Lucas定理】
正題
題目鏈接:https://www.luogu.com.cn/problem/P4640
題目大意
nnn種物品,其中ttt種物品是有個(gè)數(shù)限制的,第iii種限制為bib_ibi?,求選出mmm個(gè)物品的方案數(shù)%p\% p%p的值
1≤n,m,bi≤109,0≤t≤15,p∈[1,105]∩Pri1\leq n,m,b_i\leq 10^9,0\leq t\leq 15,p\in[1,10^5]\cap Pri1≤n,m,bi?≤109,0≤t≤15,p∈[1,105]∩Pri
解題思路
看上去就很OGF\text{OGF}OGF的題目?
對于有限制的物品為f(x)=1?xbi+11?xf(x)=\frac{1-x^{b_i+1}}{1-x}f(x)=1?x1?xbi?+1?,其他都是f(x)=11?xf(x)=\frac{1}{1-x}f(x)=1?x1?。
然后nnn個(gè)乘起來的話然后求前mmm次項(xiàng)的系數(shù)。
分子因?yàn)橹挥?span id="ze8trgl8bvbq" class="katex--inline">ttt個(gè)有值,直接暴力乘起來。下面那個(gè)分母是1(1?x)n\frac{1}{(1-x)^n}(1?x)n1?
所以對于上面如果有一個(gè)axm?kax^{m-k}axm?k那么就會產(chǎn)生貢獻(xiàn)
a∑i=0k(n+i?1n)=a(n+kn)a\sum_{i=0}^{k}\binom{n+i-1}{n}=a\binom{n+k}{n}ai=0∑k?(nn+i?1?)=a(nn+k?)
(相等于選出0~k0\sim k0~k個(gè)球放進(jìn)nnn個(gè)盒子里,開一個(gè)垃圾箱把沒用的球放進(jìn)去就好了)
然后模數(shù)小,開LucasLucasLucas就好了
時(shí)間復(fù)雜度O(2tlog?pn)O(2^t\log_p n)O(2tlogp?n)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e5+10; ll n,t,m,p,b[20],ans,inv[N],fac[N]; ll C(ll n,ll m) {return fac[n]*inv[m]%p*inv[n-m]%p;} ll L(ll n,ll m){if(n<m)return 0;if(n<p)return C(n,m);return L(n/p,m/p)*L(n%p,m%p)%p; } signed main() {scanf("%lld%lld%lld%lld",&n,&t,&m,&p);for(ll i=0;i<t;i++)scanf("%lld",&b[i]),b[i]++;inv[1]=1;for(ll i=2;i<p;i++)inv[i]=p-inv[p%i]*(p/i)%p;inv[0]=fac[0]=1;for(ll i=1;i<p;i++)fac[i]=fac[i-1]*i%p,inv[i]=inv[i-1]*inv[i]%p;ll MS=(1<<t); for(ll s=0;s<MS;s++){ll f=1,sum=0;for(ll i=0;i<t;i++)if((s>>i)&1)f=-f,sum+=b[i];(ans+=L(n+m-sum,n)*f)%=p;}printf("%lld\n",(ans+p)%p);return 0; }總結(jié)
以上是生活随笔為你收集整理的P4640-[BJWC2008]王之财宝【OGF,Lucas定理】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9首描写有关立夏的古诗 9首描写有关立夏
- 下一篇: P4199-万径人踪灭【FFT】