CF1251F-Red-White Fence【NTT】
生活随笔
收集整理的這篇文章主要介紹了
CF1251F-Red-White Fence【NTT】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
剛開始看錯題推了半天的生成函數
正題
題目鏈接:https://www.luogu.com.cn/problem/CF1251F
題目大意
nnn個白色木板,kkk個紅色木板,給出這些木板的高度,木板排成一排形成柵欄。柵欄要求只有一個紅色木板且在紅色木板左邊單調升,右邊單調降。
mmm次詢問能夠圍成周長為qiq_iqi?有多少種圍法。
解題思路
首先如果柵欄多余兩個可以看做是兩個,因為同一個高度的柵欄最多只能出現兩次,而木板相同。
因為kkk很小顯然是要我們處理kkk次,現在分開考慮出現兩次的和出現一次的方案。若出現一次的柵欄有xxx個,拿出kkk圍個的方案數就是(xk)?2k\binom{x}{k}*2^k(kx?)?2k,若出現兩次的柵欄有yyy個,拿出kkk個圍的方案數就是(k2x)\binom{k}{2x}(2xk?)
然后兩種方案卷起來就可以計算答案了。
時間復雜度O(k(nlog?n+m))O(\ k(n\log n+m)\ )O(?k(nlogn+m)?)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=(12*1e5)+10,P=998244353; struct poly{ll a[N],n; }F,G; ll n,m,t,f1,f2,r[N],a[N],v[N],b[N],f[N],pw[N],fac[N],inv[N],q[N],ans[N]; ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } void NTT(ll *f,ll n,ll op){for(ll i=0;i<n;i++)if(r[i]<i)swap(f[r[i]],f[i]);for(ll p=2;p<=n;p<<=1){ll len=p>>1;ll tmp=power(3,(P-1)/p);if(op==-1)tmp=power(tmp,P-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=f[i+len]*buf%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll invn=power(n,P-2);for(ll i=0;i<n;i++)f[i]=f[i]*invn%P;}return; } void mul(poly &a,poly &b){ll n=1;while(n<=a.n+b.n)n<<=1;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)^((i&1)?(n>>1):0);NTT(a.a,n,1);NTT(b.a,n,1);for(ll i=0;i<n;i++)a.a[i]=a.a[i]*b.a[i]%P;NTT(a.a,n,-1);return; } ll C(ll n,ll m) {return fac[n]*inv[m]%P*inv[n-m]%P;} int main() {scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);fac[0]=pw[0]=inv[0]=1;for(ll i=1;i<=4*n;i++)fac[i]=fac[i-1]*i%P,pw[i]=pw[i-1]*2%P;inv[4*n]=power(fac[4*n],P-2);for(ll i=4*n;i>1;i--)inv[i-1]=inv[i]*i%P;for(ll i=1;i<=m;i++)scanf("%lld",&b[i]);sort(b+1,b+1+m);scanf("%lld",&t);for(ll i=1;i<=t;i++)scanf("%lld",&q[i]);sort(a+1,a+1+n);ll l=1;for(ll k=1;k<=m;k++){while(l<=n&&a[l]<b[k]){if(!v[a[l]])f1++;else if(v[a[l]]==1)f1--,f2++;v[a[l]]++;l++;}memset(G.a,0,sizeof(G.a));memset(F.a,0,sizeof(F.a));for(ll i=0;i<=f1;i++)G.a[i]=pw[i]*C(f1,i)%P;G.n=f1+1;for(ll i=0;i<=2*f2;i++)F.a[i]=C(2*f2,i);F.n=2*f2+1;mul(G,F);for(ll i=1;i<=t;i++)if(q[i]>=b[k]*2+2)ans[i]=(ans[i]+G.a[q[i]/2-b[k]-1])%P;}for(ll i=1;i<=t;i++)printf("%lld\n",ans[i]);return 0; }總結
以上是生活随笔為你收集整理的CF1251F-Red-White Fence【NTT】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网吧的电脑什么配置为什么不卡顿(网吧的电
- 下一篇: 3d制图电脑配置推荐(做3d的电脑配置)