题目链接:洛谷 CF原网

题目大意:有 $n$ 个互不相同的正整数 $c_i$。问对于每一个 $1\le i\le m$,有多少个不同形态(考虑结构和点权)的二叉树满足每个点权都在 $c$ 中出现过,且点权和为 $i$。答案对 $998244353$ 取模。

$1\le n,m\le 10^5$。


首先考虑DP,$f_i$ 表示点权和为 $i$ 的树数。

那么枚举根节点的点权和两棵子树的点权和 $f_k=\sum\limits^n_{i=1}c_i\sum\limits^{k-c_i}_{j=0}f_jf_{k-c_i-j}$。

初始状态 $f_0=1$。因为空树也能作为子树。

这样的复杂度是 $O(nm^2)$,不能过。

考虑 $c$ 的生成函数 $C(x)=\sum x^{c_i}$ 和 $f$ 的生成函数 $F(x)=\sum f_ix^i$。(你问我怎么想到的?我也不知道啊)

那么容易发现原来的式子就是几个函数的卷积。

$F=C\times F\times F+1$(注意 $f_0=1$)

$C\times F^2-F+1=0$

$F=\dfrac{1\pm\sqrt{1-4C}}{2C}$

接下来看看上面该取正还是负。

取正时 $\lim\limits_{x\rightarrow 0}F(x)=+\infty$,不收敛,舍去。

取负时 $\lim\limits_{x\rightarrow 0}F(x)=1$,符合题意。

那么 $F=\dfrac{1-\sqrt{1-4C}}{2C}=\dfrac{2}{1+\sqrt{1-4C}}$。

直接套模板即可。时间复杂度 $O(m\log m)$。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=,mod=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,m,c[maxn],lim,l,rev[maxn],invtmp[maxn],Binv[maxn],sqrtmp[maxn],Csqrt[maxn],Cinv[maxn];
inline void init(int upr){
for(lim=,l=;lim<upr;lim<<=,l++);
FOR(i,,lim-) rev[i]=(rev[i>>]>>)|((i&)<<(l-));
}
inline int add(int a,int b){return a+b<mod?a+b:a+b-mod;}
inline int sub(int a,int b){return a<b?a-b+mod:a-b;}
inline int qpow(int a,int b){
int ans=;
for(;b;b>>=,a=1ll*a*a%mod) if(b&) ans=1ll*ans*a%mod;
return ans;
}
void NTT(int *A,int tp){
FOR(i,,lim-) if(i<rev[i]) swap(A[i],A[rev[i]]);
for(int i=;i<lim;i<<=)
for(int j=,r=i<<,Wn=qpow(,mod-+tp*(mod-)/r);j<lim;j+=r)
for(int k=,w=;k<i;k++,w=1ll*w*Wn%mod){
int x=A[j+k],y=1ll*A[i+j+k]*w%mod;
A[j+k]=add(x,y);A[i+j+k]=sub(x,y);
}
if(tp==-) for(int i=,linv=qpow(lim,mod-);i<lim;i++) A[i]=1ll*A[i]*linv%mod;
}
void poly_inv(int *A,int *B,int deg){
if(deg==) return void(B[]=qpow(A[],mod-));
poly_inv(A,B,(deg+)>>);
init(deg<<);
FOR(i,,deg-) invtmp[i]=A[i];
FOR(i,deg,lim-) invtmp[i]=;
NTT(invtmp,);NTT(B,);
FOR(i,,lim-) B[i]=1ll*sub(,1ll*invtmp[i]*B[i]%mod)*B[i]%mod;
NTT(B,-);
FOR(i,deg,lim-) B[i]=;
}
void poly_sqrt(int *A,int *B,int deg){
if(deg==) return void(B[]=);
poly_sqrt(A,B,(deg+)>>);
init(deg<<);
FOR(i,,lim-) Binv[i]=;
poly_inv(B,Binv,deg);
init(deg<<);
FOR(i,,deg-) sqrtmp[i]=A[i];
FOR(i,deg,lim-) Binv[i]=sqrtmp[i]=;
NTT(sqrtmp,);NTT(Binv,);
FOR(i,,lim-) sqrtmp[i]=1ll*sqrtmp[i]*Binv[i]%mod;
NTT(sqrtmp,-);
FOR(i,,deg-) B[i]=499122177ll*add(B[i],sqrtmp[i])%mod;
FOR(i,deg,lim-) B[i]=;
}
int main(){
n=read();m=read();
FOR(i,,n){
int x=read();
if(x<=m) c[x]=;
}
FOR(i,,m) c[i]=(mod-4ll*c[i]%mod)%mod;
c[]=;
poly_sqrt(c,Csqrt,m+);
Csqrt[]=add(Csqrt[],);
poly_inv(Csqrt,Cinv,m+);
FOR(i,,m) printf("%d\n",add(Cinv[i],Cinv[i]));
}

CF438E The Child and Binary Tree(生成函数,NTT)的更多相关文章

  1. CF438E The Child and Binary Tree 生成函数、多项式开根

    传送门 设生成函数\(C(x) = \sum\limits_{i=0}^\infty [\exists c_j = i]x^i\),答案数组为\(f_1 , f_2 , ..., f_m\),\(F( ...

  2. cf438E. The Child and Binary Tree(生成函数 多项式开根 多项式求逆)

    题意 链接 Sol 生成函数博大精深Orz 我们设\(f(i)\)表示权值为\(i\)的二叉树数量,转移的时候可以枚举一下根节点 \(f(n) = \sum_{w \in C_1 \dots C_n} ...

  3. [题解] CF438E The Child and Binary Tree

    CF438E The Child and Binary Tree Description 给一个大小为\(n\)的序列\(C\),保证\(C\)中每个元素各不相同,现在你要统计点权全在\(C\)中,且 ...

  4. CF438E The Child and Binary Tree(生成函数+多项式开根+多项式求逆)

    传送门 可以……这很多项式开根模板……而且也完全不知道大佬们怎么把这题的式子推出来的…… 首先,这题需要多项式开根和多项式求逆.多项式求逆看这里->这里,这里讲一讲多项式开根 多项式开方:已知多 ...

  5. Codeforces 438E The Child and Binary Tree - 生成函数 - 多项式

    题目传送门 传送点I 传送点II 传送点III 题目大意 每个点的权值$c\in {c_{1}, c_{2}, \cdots, c_{n}}$,问对于每个$1\leqslant s\leqslant ...

  6. CF438E The Child and Binary Tree

    思路 设F(x)的第x项系数为权值和为x的答案 题目中要求权值必须在集合中出现,这个不好处理,考虑再设一个C,C的第x项如果是1代表x出现在值域里,如果是0,代表x没有出现在值域里,然后由于二叉树可以 ...

  7. 【CF438E】The Child and Binary Tree(多项式运算,生成函数)

    [CF438E]The Child and Binary Tree(多项式运算,生成函数) 题面 有一个大小为\(n\)的集合\(S\) 问所有点权都在集合中,并且点权之和分别为\([0,m]\)的二 ...

  8. Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]

    CF Round250 E. The Child and Binary Tree 题意:n种权值集合C, 求点权值和为1...m的二叉树的个数, 形态不同的二叉树不同. 也就是说:不带标号,孩子有序 ...

  9. [codeforces438E]The Child and Binary Tree

    [codeforces438E]The Child and Binary Tree 试题描述 Our child likes computer science very much, especiall ...

随机推荐

  1. 使用Megacli64对服务器物理磁盘做Raid并通过uuid方式挂载

    需求说明:公司最近来了一批服务器,用于大数据业务部署.数据节点服务器由14块物理磁盘,其中有2块是900G的盘,12块是4T的盘.在服务器系统安装时,进入系统的BIOS界面:1)将2块900G的磁盘做 ...

  2. HTTP协议冷知识大全

    如果不用HTTPS,HTTP协议如何安全的传输密码信息? HTTP协议是纯文本协议,没有任何加密措施.通过HTTP协议传输的数据都可以在网络上被完全监听.如果用户登陆时将用户名和密码直接明文通过HTT ...

  3. handlebars.js 自定义helper(过滤)

    将对象数据渲染到页面上: id 插入公共样式: handlebars.js 自定义helper(过滤)demo <script id="tbody-content-template&q ...

  4. Echarts中graph类型的运用求教

    以下是百度Echarts官网上关系图的源码,但是这个关系图的node节点和edge都是静态文件里规定好的,我现在想动态实现,点击其中一个节点A然后新产生一个新节点B,并且有A和B之间的edge,就类似 ...

  5. 个人博客作业_week7

    心得 在为期将近一个月的团队编程中,给我感受最深的是敏捷开发和团队中队员之间的互补. 在最初的软件开发中,由于以前没有这方面的经验,所以并没有很大的进展.在慢慢过度中,我们找到了自己的节奏感,大家各自 ...

  6. 第三个Sprint ------第七天

    APP.java代码 package com.app.senior_calculator; import java.io.Serializable; import java.util.ArrayLis ...

  7. shiro课程的学习

    1.shiro的课程目标 (1)shiro的整体框架 各组件的概念 (2)shiro 认证 授权的过程 (3)shiro自定义的Reaml Filter (4)shiro session 管理 (5) ...

  8. Alpha 答辩总结模板

    Alpha 答辩总结模板 每个小组提供一篇总结博客(组内共享,每个人都发布),包含: 本组(组名)所有成员(短学号,名,标注组长)(1分) 组内各成员贡献比例,如不提供,取平均分后组长得分减50% G ...

  9. 【软件工程Ⅱ】作业四 |个人项目-小学四则运算 “软件”之初版(C语言)

    本次作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186 本次作业代码的github地址:https://gith ...

  10. PAT 1023 组个最小数

    https://pintia.cn/problem-sets/994805260223102976/problems/994805298269634560 给定数字0-9各若干个.你可以以任意顺序排列 ...