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 15

Sample Output

样例一:
1
3
9
样例二:
0
0
1
1
0
2
4
2
6
15
样例三:
0
0
0
1
0
1
0
2
0
5

HINT

对于第一个样例,有9个权值恰好为3的神犇二叉树:

Source

https://www.cnblogs.com/neighthorn/p/6497364.html

利用了二叉树的递归定义,注意空树情况要加一,因为生成函数的$x^0$为$0$,也就是默认了根节点必须有数。

剩下的就是多项式开根和逆元了。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define rep(i,l,r) for (int i=l; i<=r; i++)
  4. typedef long long ll;
  5. using namespace std;
  6.  
  7. const int N=(<<)+,P=,g=,inv2=(P+)/;
  8. int n,x,m,c[N],a[N],f[N],t[N],ib[N],rev[N];
  9.  
  10. int ksm(ll a,int b){
  11. ll res;
  12. for (res=; b; a=(a*a)%P,b>>=)
  13. if (b & ) res=res*a%P;
  14. return res;
  15. }
  16.  
  17. void DFT(int a[],int n,int f){
  18. rep(i,,n-) if (i<rev[i]) swap(a[i],a[rev[i]]);
  19. for (int i=; i<n; i<<=){
  20. ll wn=ksm(g,(f==) ? (P-)/(i<<) : (P-)-(P-)/(i<<));
  21. for (int j=,p=i<<; j<n; j+=p){
  22. ll w=;
  23. for (int k=; k<i; k++,w=1ll*w*wn%P){
  24. int x=a[j+k],y=1ll*w*a[i+j+k]%P;
  25. a[j+k]=(x+y)%P; a[i+j+k]=(x-y+P)%P;
  26. }
  27. }
  28. }
  29. if (f==-){
  30. int inv=ksm(n,P-);
  31. rep(i,,n-) a[i]=1ll*a[i]*inv%P;
  32. }
  33. }
  34.  
  35. void inverse(int a[],int b[],int l){
  36. if (l==){ b[]=ksm(a[],P-); return; }
  37. inverse(a,b,l>>);
  38. int n=,L=; while (n<(l<<))n<<=,L++;
  39. rep(i,,n-) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
  40. rep(i,,l-) t[i]=a[i];
  41. rep(i,l,n-) t[i]=;
  42. DFT(t,n,); DFT(b,n,);
  43. rep(i,,n-) b[i]=1ll*b[i]*(-1ll*t[i]*b[i]%P+P)%P;
  44. DFT(b,n,-);
  45. rep(i,l,n-) b[i]=;
  46. }
  47.  
  48. void Sqrt(int a[],int b[],int l){
  49. if (l==) { b[]=; return; }
  50. Sqrt(a,b,l>>);
  51. int n=,L=; while (n<(l<<)) n<<=,L++;
  52. rep(i,,n-) ib[i]=;
  53. inverse(b,ib,l);
  54. rep(i,,n-) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
  55. rep(i,,l-) t[i]=a[i];
  56. rep(i,l,n-) t[i]=;
  57. DFT(t,n,); DFT(b,n,); DFT(ib,n,);
  58. rep(i,,n-) b[i]=1ll*inv2*(b[i]+1ll*t[i]*ib[i]%P)%P;
  59. DFT(b,n,-);
  60. rep(i,l,n-) b[i]=;
  61. }
  62.  
  63. int main(){
  64. freopen("bzoj3625.in","r",stdin);
  65. freopen("bzoj3625.out","w",stdout);
  66. scanf("%d%d",&n,&m); c[]=;
  67. rep(i,,n) scanf("%d",&x),c[x]-=;
  68. rep(i,,m) if (c[i]<) c[i]+=P;
  69. int len=; while (len<=m) len<<=;
  70. Sqrt(c,a,len);
  71. a[]++; if (a[]>=P) a[]-=P;
  72. inverse(a,f,len);
  73. rep(i,,m) printf("%d\n",f[i]*%P);
  74. return ;
  75. }

[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)的更多相关文章

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

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

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

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

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

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

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

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

  5. [题解] 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}\) ...

  6. 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( ...

  7. [codeforces438E]The Child and Binary Tree

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

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

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

  9. Codeforces Round #250 (Div. 1)E. The Child and Binary Tree

    题意:有一个集合,求有多少形态不同的二叉树满足每个点的权值都属于这个集合并且总点权等于i 题解:先用生成函数搞出来\(f(x)=f(x)^2*c(x)+1\) 然后转化一下变成\(f(x)=\frac ...

随机推荐

  1. laravel artisan 工具心得

    介绍一些非常好用的命令: 1.创建一个Eloquent模型:顺便创建一个对应的数据库表 php artisan make:model --migration Models/Admin/test 2.将 ...

  2. python常用库之base64

    1. 什么是base64 base64是一种将不可见字符转换为可见字符的编码方式. 2. 如何使用 最简单的使用方式 import base64 if __name__ == '__main__': ...

  3. 22、WebDriver

    什么是WebDriver?1.Webdriver(Selenium2)是一种用于Web应用程序的自动测试工具:2.它提供了一套友好的API:3.Webdriver完全就是一套类库,不依赖任何测试框架, ...

  4. 使用Burpsuite爆破弱口令教工号

    使用Burpsuite爆破弱口令教工号 发表于 2015-11-18   |   分类于 Burpsuite  |   1条评论  |   26次阅读 准备 所谓工欲善其事,必先利其器,首先当然是要下 ...

  5. tensorflow.nn.bidirectional_dynamic_rnn()函数的用法

    在分析Attention-over-attention源码过程中,对于tensorflow.nn.bidirectional_dynamic_rnn()函数的总结: 首先来看一下,函数: def bi ...

  6. Struts结果跳转方式(四种result配置)

    1.转发(默认转发)

  7. spring web 生命周期理解

    spring web /bean 生命周期 反射注解 aop代理类生成 init servlet  初始化 load spring-context.xml load XmlParser 类解析对象   ...

  8. Sublime Text2使用规则

    Sublime Text是我发现的有一好用的编辑器,它不单单只支持 python ,几乎支持目前主流的语言,快捷键丰富,可以极大的提高代码开发效率.Sublime Text 网址:http://www ...

  9. [转载]ACE的陷阱

    转自: http://blog.csdn.net/fullsail/article/details/2915685 坦白说,使用这个标题无非是希望能够吸引你的眼球,这篇文章的目的仅仅是为了揭示一些AC ...

  10. 解决UC手机字体变大的有关问题

    解决UC手机字体变大的问题 UC手机浏览器在识别到页面文字很多的情况下会自动放大字体优化阅读体验,如果要关闭这个功能需要在网页头部添加: <meta name="wap-font-sc ...