#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】普通的计数题的更多相关文章

  1. uoj #450[集训队作业2018]复读机

    传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...

  2. UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp

    LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...

  3. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  4. 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

    [UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...

  5. UOJ #449. 【集训队作业2018】喂鸽子

    UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...

  6. UOJ#418. 【集训队作业2018】三角形

    #418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...

  7. UOJ#422. 【集训队作业2018】小Z的礼物

    #422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...

  8. [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP

    题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...

  9. uoj450 【集训队作业2018】复读机(生成函数,单位根反演)

    uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...

随机推荐

  1. Python全栈开发:运算符

    1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算: 5.成员运算:

  2. Atcoder arc096

    C:Half and Half 几个if语句贪心算一算就好了 #include<cstdio> #include<algorithm> using namespace std; ...

  3. DbUtils要点小结

    一. DbUtils核心API 1. QueryRunner update方法 query方法 2. 各种Handler都实现ResultSetHandler接口 beanhandler beanli ...

  4. Spring Cache 简介

    org.springframework.cache; org.springframework.cache.Cache org.springframework.cache.CacheManager 依赖 ...

  5. 数论GCD——cf1055C

    被一道数论题卡了半天 网上的题解说只要匹配l或者r就行,想了下还真是.. 能让r1和r2对其就让他们对其,不能对其就讨论一下两种情况就可以了 #include <bits/stdc++.h> ...

  6. LeeCode-Single Number III

    Given an array of numbers nums, in which exactly two elements appear only once and all the other ele ...

  7. SEO-----网站不被收录的原因

    1.  新站的收录较慢 2. 文章质量不高 文章难以阅读  排版乱 内容是别的网站采集来的  很难被收录 3. 网站被降权中 4. 蜘蛛不访问[网站配置] 检查网站是否屏蔽了蜘蛛的爬取[ robots ...

  8. CMS 源码解读

    CMS 是”Content Management System” 的缩写,意为” 内容管理系统”. 内容管理系统是企业信息化建设和电子政务的新宠,也是一个相对较新的市场.对于内容管理,业界还没有一个统 ...

  9. c#设置文件及文件夹的属性

    c#中通过FileAttributes枚举来设置文件或文件夹的属性. FileAttributes 枚举 成员名称 说明 Archive 文件的存档状态.应用程序使用此属性为文件加上备份或移除标记. ...

  10. oracle中utl_file包读写文件操作实例学习

    在oracle中utl_file包提供了一些操作文本文件的函数和过程,学习了一下他的基本操作 1.创建directory,并给用户授权 复制代码 代码如下: --创建directory create ...