[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)
3625: [Codeforces Round #250]小朋友和二叉树
Time Limit: 40 Sec Memory Limit: 256 MB
Submit: 650 Solved: 283
[Submit][Status][Discuss]Description
我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树。
考虑一个含有n个互异正整数的序列c[1],c[2],...,c[n]。如果一棵带点权的有根二叉树满足其所有顶点的权值都在集合{c[1],c[2],...,c[n]}中,我们的小朋友就会将其称作神犇的。并且他认为,一棵带点权的树的权值,是其所有顶点权值的总和。
给出一个整数m,你能对于任意的s(1<=s<=m)计算出权值为s的神犇二叉树的个数吗?请参照样例以更好的理解什么样的两棵二叉树会被视为不同的。
我们只需要知道答案关于998244353(7*17*2^23+1,一个质数)取模后的值。Input
第一行有2个整数 n,m(1<=n<=10^5; 1<=m<=10^5)。
第二行有n个用空格隔开的互异的整数 c[1],c[2],...,c[n](1<=c[i]<=10^5)。Output
输出m行,每行有一个整数。第i行应当含有权值恰为i的神犇二叉树的总数。请输出答案关于998244353(=7*17*2^23+1,一个质数)取模后的结果。
Sample Input
样例一:
2 3
1 2
样例二:
3 10
9 4 3
样例三:
5 10
13 10 6 4 15Sample Output
样例一:
1
3
9
样例二:
0
0
1
1
0
2
4
2
6
15
样例三:
0
0
0
1
0
1
0
2
0
5HINT
对于第一个样例,有9个权值恰好为3的神犇二叉树:
Source
https://www.cnblogs.com/neighthorn/p/6497364.html
利用了二叉树的递归定义,注意空树情况要加一,因为生成函数的$x^0$为$0$,也就是默认了根节点必须有数。
剩下的就是多项式开根和逆元了。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=(<<)+,P=,g=,inv2=(P+)/;
int n,x,m,c[N],a[N],f[N],t[N],ib[N],rev[N]; int ksm(ll a,int b){
ll res;
for (res=; b; a=(a*a)%P,b>>=)
if (b & ) res=res*a%P;
return res;
} void DFT(int a[],int n,int f){
rep(i,,n-) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=; i<n; i<<=){
ll wn=ksm(g,(f==) ? (P-)/(i<<) : (P-)-(P-)/(i<<));
for (int j=,p=i<<; j<n; j+=p){
ll w=;
for (int k=; k<i; k++,w=1ll*w*wn%P){
int x=a[j+k],y=1ll*w*a[i+j+k]%P;
a[j+k]=(x+y)%P; a[i+j+k]=(x-y+P)%P;
}
}
}
if (f==-){
int inv=ksm(n,P-);
rep(i,,n-) a[i]=1ll*a[i]*inv%P;
}
} void inverse(int a[],int b[],int l){
if (l==){ b[]=ksm(a[],P-); return; }
inverse(a,b,l>>);
int n=,L=; while (n<(l<<))n<<=,L++;
rep(i,,n-) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
rep(i,,l-) t[i]=a[i];
rep(i,l,n-) t[i]=;
DFT(t,n,); DFT(b,n,);
rep(i,,n-) b[i]=1ll*b[i]*(-1ll*t[i]*b[i]%P+P)%P;
DFT(b,n,-);
rep(i,l,n-) b[i]=;
} void Sqrt(int a[],int b[],int l){
if (l==) { b[]=; return; }
Sqrt(a,b,l>>);
int n=,L=; while (n<(l<<)) n<<=,L++;
rep(i,,n-) ib[i]=;
inverse(b,ib,l);
rep(i,,n-) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
rep(i,,l-) t[i]=a[i];
rep(i,l,n-) t[i]=;
DFT(t,n,); DFT(b,n,); DFT(ib,n,);
rep(i,,n-) b[i]=1ll*inv2*(b[i]+1ll*t[i]*ib[i]%P)%P;
DFT(b,n,-);
rep(i,l,n-) b[i]=;
} int main(){
freopen("bzoj3625.in","r",stdin);
freopen("bzoj3625.out","w",stdout);
scanf("%d%d",&n,&m); c[]=;
rep(i,,n) scanf("%d",&x),c[x]-=;
rep(i,,m) if (c[i]<) c[i]+=P;
int len=; while (len<=m) len<<=;
Sqrt(c,a,len);
a[]++; if (a[]>=P) a[]-=P;
inverse(a,f,len);
rep(i,,m) printf("%d\n",f[i]*%P);
return ;
}
[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)的更多相关文章
- 【CF438E】The Child and Binary Tree(多项式运算,生成函数)
[CF438E]The Child and Binary Tree(多项式运算,生成函数) 题面 有一个大小为\(n\)的集合\(S\) 问所有点权都在集合中,并且点权之和分别为\([0,m]\)的二 ...
- Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]
CF Round250 E. The Child and Binary Tree 题意:n种权值集合C, 求点权值和为1...m的二叉树的个数, 形态不同的二叉树不同. 也就是说:不带标号,孩子有序 ...
- Codeforces 438E The Child and Binary Tree - 生成函数 - 多项式
题目传送门 传送点I 传送点II 传送点III 题目大意 每个点的权值$c\in {c_{1}, c_{2}, \cdots, c_{n}}$,问对于每个$1\leqslant s\leqslant ...
- cf438E. The Child and Binary Tree(生成函数 多项式开根 多项式求逆)
题意 链接 Sol 生成函数博大精深Orz 我们设\(f(i)\)表示权值为\(i\)的二叉树数量,转移的时候可以枚举一下根节点 \(f(n) = \sum_{w \in C_1 \dots C_n} ...
- [题解] Codeforces 438 E The Child and Binary Tree DP,多项式,生成函数
题目 首先令\(f_i\)表示权值和为\(i\)的二叉树数量,\(f_0=1\). 转移为:\(f_k=\sum_{i=0}^n \sum_{j=0}^{k-c_i}f_j f_{k-c_i-j}\) ...
- 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( ...
- [codeforces438E]The Child and Binary Tree
[codeforces438E]The Child and Binary Tree 试题描述 Our child likes computer science very much, especiall ...
- [题解] CF438E The Child and Binary Tree
CF438E The Child and Binary Tree Description 给一个大小为\(n\)的序列\(C\),保证\(C\)中每个元素各不相同,现在你要统计点权全在\(C\)中,且 ...
- Codeforces Round #250 (Div. 1)E. The Child and Binary Tree
题意:有一个集合,求有多少形态不同的二叉树满足每个点的权值都属于这个集合并且总点权等于i 题解:先用生成函数搞出来\(f(x)=f(x)^2*c(x)+1\) 然后转化一下变成\(f(x)=\frac ...
随机推荐
- 【CodeForces】947 D. Picking Strings
[题目]D. Picking Strings [题意]给定只含'A','B','C'的字符串,支持以下变换:1.A - BC 2.B - AC 3.C - AB 4.AAA - empty ...
- 20155117王震宇 2006-2007-2 《Java程序设计》第5周学习总结
教材学习内容总结 try & catch java中的错误会被打包成对象,可以尝试(try)捕捉(catch)代表错误的对象后做一些处理.如果发生错误,会跳到catch的区块并执行. 异常结构 ...
- c++ virtual总结
virtual-关键字用于修饰成员函数时,有以下特性 1.用于修饰的基类的成员函数,被修饰的基类成员函数-其派生类的同名成员函数也默认带有virtual 关键字2.当virtual 用于修饰析构函数( ...
- 【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)
题目链接 易得第\(i\)关的最小攻击力为\(\max_{j=1}^i\frac{sum[i]-sum[j-1]}{x+d*(i-j)}\) 十分像一个斜率式,于是看作一个点\(P(x+d*i,sum ...
- 2017ACM暑期多校联合训练 - Team 1 1011 HDU 6043 KazaQ's Socks (找规律)
题目链接 Problem Description KazaQ wears socks everyday. At the beginning, he has n pairs of socks numbe ...
- 强连通图(最多加入几条边使得图仍为非强连通图)G - Strongly connected HDU - 4635
题目链接:https://cn.vjudge.net/contest/67418#problem/G 具体思路:首先用tarjan缩点,这个时候就会有很多个缩点,然后再选取一个含有点数最少,并且当前这 ...
- 我的Apache又挂了之apache错误:server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName'
表示物理机装Apache然后有时候关机会忘了关闭Apache然后长此以往会导致各种Apache起不来的缘故,上一次已经出现过一次.今天又出现了 再次记录一下解决的方法. 1.查看错误日志 /var/l ...
- Postgres中tuple的组装与插入
1.相关的数据类型 我们先看相关的数据类型: HeapTupleData(src/include/access/htup.h) typedef struct HeapTupleData { uint3 ...
- 分布式系统的负载均衡以及ngnix负载均衡的五种策略
一般而言,有以下几种常见的负载均衡策略: 一.轮询. 特点:给每个请求标记一个序号,然后将请求依次派发到服务器节点中,适用于集群中各个节点提供服务能力等同且无状态的场景. 缺点:该策略将节点视为等同, ...
- PCA算法和SVD
如果矩阵对某一个向量或某些向量只发生伸缩变换,不对这些向量产生旋转的效果,那么这些向量就称为这个矩阵的特征向量,伸缩的比例就是特征值.这里可以将特征值为负,特征向量旋转180度,也可看成方向不变,伸缩 ...