博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UOJ#428. 【集训队作业2018】普通的计数题
阅读量:6770 次
发布时间:2019-06-26

本文共 2470 字,大约阅读时间需要 8 分钟。

 

模型转化好题

所以变成统计有标号合法的树的个数。

合法限制:

1.根标号比子树都大

2.如果儿子全是叶子,数量B中有

3.如果存在一个儿子不是叶子,数量A中有

 

然后考虑DP

直接枚举根的儿子的情况

cdq分治NTT还是很恶心的

不光是自己卷自己,还是互相卷

进行一番化简和平移之后,可以转化为cdq分治NTT的形式:

怎么好做怎么来。

反正我最后推的式子有如下特点(式子就不写了):

为了方便,钦定g[0],f[0],g[1],f[1]都是0

对于f,a是固定的,a向右平移一下,然后就是cdq分治的模板题了

对于g,当cdq的分治区间l不是0的时候,要F作为[l,mid],G作为[ql,qr],和G作为[l,mid],F作为[ql,qr]做两遍

这样其实剩下g[n]=g[0]*f[n],但是g[0]=0,所以不用管

代码:

const int N=240000+5;int jie[N],inv[N];int f[N],g[N];int n,sa,sb;int ta[N],b[N],a[N];void divi(int l,int r,int ql,int qr){    // cout<<" divi "<
<<" "<
<<" ql "<
<<" qr "<
<
>1; int qmd=(ql+qr)>>1; divi(l,mid,ql,qmd); Poly A,G; A.resize(qr-ql+1); G.resize(mid-l+1); for(reg i=ql;i<=qr;++i){ A[i-ql]=a[i]; } for(reg i=l;i<=mid;++i){ G[i-l]=g[i]; } A*=G; for(reg i=mid+1;i<=r;++i){ f[i]=ad(f[i],A[i-l]); } if(l==0){ Poly F;G.clear(); F.resize(mid-l+1); G.resize(mid-l+1); for(reg i=l;i<=mid;++i){ F[i-l]=f[i]; G[i-l]=g[i]; } F=F*G; for(reg i=mid+1;i<=r;++i){ g[i]=ad(g[i],F[i]); } }else{ Poly F;G.clear(); F.resize(qr-ql+1); G.resize(mid-l+1); for(reg i=l;i<=mid;++i){ G[i-l]=g[i]; } for(reg i=ql;i<=qr;++i){ F[i-ql]=f[i]; } F=F*G; for(reg i=mid+1;i<=r;++i){ g[i]=ad(g[i],F[i-l]); } F.clear();G.clear(); F.resize(mid-l+1); G.resize(qr-ql+1); for(reg i=ql;i<=qr;++i){ G[i-ql]=g[i]; } for(reg i=l;i<=mid;++i){ F[i-l]=f[i]; } F=F*G; for(reg i=mid+1;i<=r;++i){ g[i]=ad(g[i],F[i-l]); } } divi(mid+1,r,ql,qmd);}int main(){ rd(n);rd(sa);rd(sb);int x; for(reg i=1;i<=sa;++i){rd(x);ta[x]=1;} for(reg i=1;i<=sb;++i){rd(x);b[x]=1;} if(n==1){ puts("1");return 0; } int m; for(m=1;m<=n;m<<=1); jie[0]=1; for(reg i=1;i<=m;++i) jie[i]=mul(jie[i-1],i); inv[m]=qm(jie[m],mod-2); for(reg i=m-1;i>=0;--i) inv[i]=mul(inv[i+1],i+1); for(reg i=1;i<=m;++i){ a[i]=mul(ta[i-1],inv[i-1]); } a[0]=0; divi(0,m-1,0,m-1); ll ans=f[n]; ans=mul(ans,jie[n-1]); ot(ans); return 0;}

树形结构很巧妙啊

f,g互相卷的分治NTT第一次写,还是举一个0,1,2,3,4,5,6,7的例子最好理解了!

 

转载于:https://www.cnblogs.com/Miracevin/p/10994486.html

你可能感兴趣的文章
LogBoy 之Android Studio控制台输出日志太多清空
查看>>
wildfly jboss 优化配置
查看>>
iOS地图 -- 定位初使用
查看>>
【xml】转义字符 &lt;等符号出现的原因
查看>>
[Angular 2] Generate Angular 2 Components Programmatically with entryComponents & ViewContainerRef
查看>>
Android使用Unity导致Activity被销毁的解决办法
查看>>
linux下共享内存mmap和DMA(直接访问内存)的使用 【转】
查看>>
面试题目——《CC150》中等难题
查看>>
转:windows下命令行工具
查看>>
缓存使用中的注意事项
查看>>
王立平-- android:layout_weight
查看>>
cache(缓存)的作用
查看>>
Spring 集成 redistemplate
查看>>
云平台Linux主机安装流程
查看>>
Linux Centos 删除除某(多)个文件之外的所有文件
查看>>
[开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧
查看>>
C#中Collection,List和ArrayList的区别(转)
查看>>
spring 概念理解(资料)
查看>>
毕业生 - 哈尔滨工业大学社会计算与信息检索研究中心 - 理解语言,认知社会...
查看>>
apex 返回标准的页面 standard view
查看>>