UOJ#428. 【集训队作业2018】普通的计数题
模型转化好题

所以变成统计有标号合法的树的个数。
合法限制:
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=+;
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 "<<l<<" "<<r<<" ql "<<ql<<" qr "<<qr<<endl;
if(l==&&r==){
f[]=f[]=g[]=g[]=;
return;
}
if(l==r){
f[l]=ad(mul(f[l],jie[l-]),b[l-]);
g[l]=ad(f[l],mul(g[l],jie[l-]));
f[l]=mul(f[l],inv[l-]);
g[l]=mul(g[l],inv[l]);
return;
}
int mid=(l+r)>>;
int qmd=(ql+qr)>>;
divi(l,mid,ql,qmd);
Poly A,G;
A.resize(qr-ql+);
G.resize(mid-l+);
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+;i<=r;++i){
f[i]=ad(f[i],A[i-l]);
} if(l==){
Poly F;G.clear();
F.resize(mid-l+);
G.resize(mid-l+);
for(reg i=l;i<=mid;++i){
F[i-l]=f[i];
G[i-l]=g[i];
}
F=F*G;
for(reg i=mid+;i<=r;++i){
g[i]=ad(g[i],F[i]);
}
}else{
Poly F;G.clear();
F.resize(qr-ql+);
G.resize(mid-l+);
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+;i<=r;++i){
g[i]=ad(g[i],F[i-l]);
}
F.clear();G.clear();
F.resize(mid-l+);
G.resize(qr-ql+);
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+;i<=r;++i){
g[i]=ad(g[i],F[i-l]);
}
}
divi(mid+,r,ql,qmd);
}
int main(){
rd(n);rd(sa);rd(sb);int x;
for(reg i=;i<=sa;++i){rd(x);ta[x]=;}
for(reg i=;i<=sb;++i){rd(x);b[x]=;}
if(n==){
puts("");return ;
}
int m;
for(m=;m<=n;m<<=);
jie[]=;
for(reg i=;i<=m;++i) jie[i]=mul(jie[i-],i);
inv[m]=qm(jie[m],mod-);
for(reg i=m-;i>=;--i) inv[i]=mul(inv[i+],i+); for(reg i=;i<=m;++i){
a[i]=mul(ta[i-],inv[i-]);
}
a[]=; divi(,m-,,m-);
ll ans=f[n];
ans=mul(ans,jie[n-]);
ot(ans);
return ;
}
树形结构很巧妙啊
f,g互相卷的分治NTT第一次写,还是举一个0,1,2,3,4,5,6,7的例子最好理解了!
UOJ#428. 【集训队作业2018】普通的计数题的更多相关文章
- uoj #450[集训队作业2018]复读机
传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...
- UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp
LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- UOJ #449. 【集训队作业2018】喂鸽子
UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...
- UOJ#418. 【集训队作业2018】三角形
#418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...
- UOJ#422. 【集训队作业2018】小Z的礼物
#422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...
- [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP
题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...
- uoj450 【集训队作业2018】复读机(生成函数,单位根反演)
uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...
随机推荐
- 基于VGGnet的人脸识别系统-ubuntu 系统下的Caffe环境搭建(CPU)
对于caffe的系统一般使用linux系统,当然也有windows版本的caffe,不过如果你一开始使用了windows下面的caffe,后面学习的过程中,会经常遇到各种错误,网上下载的一些源码.模型 ...
- node vue 微信公众号(四)配置环境 本地测试
1.去natap 配置端口号 //本地项目是8080端口,natapp就配置8080端口 2.ngrok配合vue-cli实现外网访问 1.去 https://ngrok.com/download 下 ...
- 2016.8.19上午初中部NOIP普及组比赛总结
2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ...
- 回首2018 | 分析型数据库AnalyticDB: 不忘初心 砥砺前行
题记 分析型数据库AnalyticDB(下文简称ADB),是阿里巴巴自主研发.唯一经过超大规模以及核心业务验证的PB级实时数据仓库.截止目前,现有外部支撑客户既包括传统的大中型企业和政府机构,也包括众 ...
- SPOJ 1043 GSS1 - Can you answer these queries I
题目描述 给出了序列A[1],A[2],-,A[N]. (a[i]≤15007,1≤N≤50000).查询定义如下: 查询(x,y)=max{a[i]+a[i+1]+-+a[j]:x≤i≤j≤y}. ...
- OpenCASCADE动画功能2
OpenCASCADE动画功能2 eryar@163.com OpenCASCADE是一个开发平台,主要提供三维曲面和实体建模.CAD数据交换及可视化等功能.OCCT最适用于开发三维建模CAD软件.加 ...
- Linux 的文件和目录管理类命令
文件和目录管理类的命令 目录: cd ~[username] ~:指定用户的家目录 cd -:回到上一次所在的目录 路径: 相对路径中: .:当前目录 ..:父目录 pwd: print workin ...
- 模板——二分图匹配KM
具体方法就不介绍了,详见 https://blog.csdn.net/sixdaycoder/article/details/47720471 主要讲一些注意点: 1:不直接将未匹配的y减小是因为要保 ...
- 基于vue-cli的vs code设置
vue-cli自带eslin校验,vs code采用下可以设置在保存文件时会自动纠正格式 { // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detec ...
- HttpServletRequest request 获取当前登录的用户-获取当前用户
有的业务需要知道当前登录的用户 当然需要引用这个啦 import javax.servlet.http.HttpServletRequest; 然后 HttpSession session = req ...