传送门

codeforces传送门codeforces传送门codeforces传送门

生成函数好题。

卡场差评至今未过

题意简述:nnn个点的二叉树,每个点的权值KaTeX parse error: Expected 'EOF', got '\inC' at position 4: v_i\̲i̲n̲C̲=\{a_1,a_2,...a…,定义一棵树的权值为所有点的权值之和,问有多少棵树满足其权值等于i(i=1,2,...,m)i(i=1,2,...,m)i(i=1,2,...,m)


对每个点的值构造生成函数g(x)=∑nanxn(an=[n∈C])g(x)=\sum_na_nx^n(a_n=[n\in C])g(x)=∑n​an​xn(an​=[n∈C]),令f(x)f(x)f(x)表示答案的生成函数。

那么f(x)=g(x)f2(x)+1f(x)=g(x)f^2(x)+1f(x)=g(x)f2(x)+1 注意空树的情况,这个递推式相当于考虑自己的权值以及左右子树的权值

然后解方程:f(x)=21−1−4g(x)f(x)=\frac 2{1-\sqrt{1-4g(x)}}f(x)=1−1−4g(x)​2​

然后上多项式开方和多项式求逆即可。

悲伤的故事:封装了一波多项式运算导致常数太大,于是只能在codeforcescodeforcescodeforces上水过,bzojbzojbzoj至今未过

代码:

  1. #include<bits/stdc++.h>
  2. #define ri register int
  3. using namespace std;
  4. inline int read(){
  5. int ans=0;
  6. char ch=getchar();
  7. while(!isdigit(ch))ch=getchar();
  8. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  9. return ans;
  10. }
  11. typedef long long ll;
  12. const int mod=998244353;
  13. int n,lim,tim,m;
  14. vector<int>A,B,pos,Inv;
  15. #define add(a,b) ((a)+(b)>=mod?(a)+(b)-mod:(a)+(b))
  16. #define dec(a,b) ((a)>=(b)?(a)-(b):(a)-(b)+mod)
  17. #define mul(a,b) ((ll)(a)*(b)%mod)
  18. inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=mul(a,a))if(p&1)ret=mul(ret,a);return ret;}
  19. inline void ntt(vector<int>&a,const int&type){
  20. for(ri i=0;i<lim;++i)if(i<pos[i])swap(a[i],a[pos[i]]);
  21. for(ri mid=1,wn,mult=(mod-1)/2,typ=type==1?3:(mod+1)/3;mid<lim;mid<<=1,mult>>=1){
  22. wn=ksm(typ,mult);
  23. for(ri j=0,len=mid<<1;j<lim;j+=len)for(ri w=1,a0,a1,k=0;k<mid;++k,w=mul(w,wn)){
  24. a0=a[j+k],a1=mul(w,a[j+k+mid]);
  25. a[j+k]=add(a0,a1),a[j+k+mid]=dec(a0,a1);
  26. }
  27. }
  28. if(type==-1)for(ri i=0,inv=ksm(lim,mod-2);i<lim;++i)a[i]=mul(a[i],inv);
  29. }
  30. inline void init(const int&up){
  31. lim=1,tim=0;
  32. while(lim<=up)lim<<=1,++tim;
  33. pos.resize(lim),pos[0]=0;
  34. for(ri i=0;i<lim;++i)pos[i]=(pos[i>>1]>>1)|((i&1)<<(tim-1));
  35. }
  36. struct poly{
  37. vector<int>a;
  38. inline int deg()const{return a.size()-1;}
  39. poly(int k,int x=0){a.resize(k+1),a[k]=x;}
  40. inline int&operator[](const int&k){return a[k];}
  41. inline const int&operator[](const int&k)const{return a[k];}
  42. inline poly extend(const int&k){poly ret=*this;return ret.a.resize(k),ret;}
  43. friend inline poly operator+(const poly&a,const poly&b){
  44. poly ret(max(a.deg(),b.deg()));
  45. for(ri i=0;i<=a.deg();++i)ret[i]=add(ret[i],a[i]);
  46. for(ri i=0;i<=b.deg();++i)ret[i]=add(ret[i],b[i]);
  47. return ret;
  48. }
  49. friend inline poly operator-(const poly&a,const poly&b){
  50. poly ret(max(a.deg(),b.deg()));
  51. for(ri i=0;i<=a.deg();++i)ret[i]=add(ret[i],a[i]);
  52. for(ri i=0;i<=b.deg();++i)ret[i]=dec(ret[i],b[i]);
  53. return ret;
  54. }
  55. friend inline poly operator*(const int&a,const poly&b){
  56. poly ret(b.deg());
  57. for(ri i=0;i<=b.deg();++i)ret[i]=mul(a,b[i]);
  58. return ret;
  59. }
  60. friend inline poly operator*(const poly&a,const poly&b){
  61. int n=a.deg(),m=b.deg();
  62. init(n+m),A.resize(lim),B.resize(lim);
  63. poly ret(lim-1);
  64. for(ri i=0;i<=n;++i)A[i]=a[i];
  65. for(ri i=0;i<=m;++i)B[i]=b[i];
  66. for(ri i=n+1;i<lim;++i)A[i]=0;
  67. for(ri i=m+1;i<lim;++i)B[i]=0;
  68. ntt(A,1),ntt(B,1);
  69. for(ri i=0;i<lim;++i)A[i]=mul(A[i],B[i]);
  70. return ntt(A,-1),ret.a=A,ret;
  71. }
  72. inline poly poly_inv(poly a,const int&k){
  73. a=a.extend(k);
  74. if(k==1)return poly(0,ksm(a[0],mod-2));
  75. poly f0=poly_inv(a,(k+1)>>1);
  76. return (2*f0-((f0*f0.extend(k))*a).extend(k)).extend(k);
  77. }
  78. inline poly poly_sqrt(poly a,const int&k){
  79. a=a.extend(k);
  80. if(k==1)return poly(0,1);
  81. poly f0=poly_sqrt(a,(k+1)>>1).extend(k);
  82. return (((f0*f0).extend(k)+a)*poly_inv((2*f0),k)).extend(k);
  83. }
  84. };
  85. int main(){
  86. n=read(),m=read();
  87. int len;
  88. for(len=1;len<=m;len<<=1);
  89. poly sqr=(len);
  90. for(ri i=1,v;i<=n;++i){
  91. v=read();
  92. if(v<=m)sqr[v]=mod-4;
  93. }
  94. ++sqr[0],sqr=sqr.poly_sqrt(sqr,len),++sqr[0],sqr=sqr.poly_inv(sqr,len);
  95. for(ri i=1;i<=m;++i)cout<<mul(sqr[i],2)<<'\n';
  96. return 0;
  97. }

2019.01.01 bzoj3625:小朋友和二叉树(生成函数+多项式求逆+多项式开方)的更多相关文章

  1. FFT模板 生成函数 原根 多项式求逆 多项式开根

    FFT #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> ...

  2. 【BZOJ3625】【codeforces438E】小朋友和二叉树 生成函数+多项式求逆+多项式开根

    首先,我们构造一个函数$G(x)$,若存在$k∈C$,则$[x^k]G(x)=1$. 不妨设$F(x)$为最终答案的生成函数,则$[x^n]F(x)$即为权值为$n$的神犇二叉树个数. 不难推导出,$ ...

  3. [Codeforces438E][bzoj3625] 小朋友和二叉树 [多项式求逆+多项式开根]

    题面 传送门 思路 首先,我们把这个输入的点的生成函数搞出来: $C=\sum_{i=0}^{lim}s_ix^i$ 其中$lim$为集合里面出现过的最大的数,$s_i$表示大小为$i$的数是否出现过 ...

  4. BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 ——NTT 多项式求逆 多项式开根

    生成函数又有奇妙的性质. $F(x)=C(x)*F(x)*F(x)+1$ 然后大力解方程,得到一个带根号的式子. 多项式开根有解只与常数项有关. 发现两个解只有一个是成立的. 然后多项式开根.求逆. ...

  5. bzoj 3625小朋友和二叉树 多项式求逆+多项式开根 好题

    题目大意 给定n种权值 给定m \(F_i表示权值和为i的二叉树个数\) 求\(F_1,F_2...F_m\) 分析 安利博客 \(F_d=F_L*F_R*C_{mid},L+mid+R=d\) \( ...

  6. [BZOJ3456]城市规划(生成函数+多项式求逆+多项式求ln)

    城市规划 时间限制:40s      空间限制:256MB 题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.  刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一 ...

  7. NTT+多项式求逆+多项式开方(BZOJ3625)

    定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...

  8. 【BZOJ3625】【CF438E】小朋友和二叉树 NTT 生成函数 多项式开根 多项式求逆

    题目大意 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\ldots ,c_n\).如果一棵带点权的有根二叉树满足其所有顶点的权值都在集合\(\{c_1,c_2,\ldots ,c_n\ ...

  9. 【BZOJ3625/CF438E】小朋友和二叉树(多项式求逆,多项式开方)

    [BZOJ3625/CF438E]小朋友和二叉树(多项式求逆,多项式开方) 题面 BZOJ CodeForces 大致题意: 对于每个数出现的次数对应的多项式\(A(x)\) 求\[f(x)=\fra ...

随机推荐

  1. swift 关于didSet 和willSet赋值的注意点

    1. 初始化赋值的时候都不会走这个的方法, 需要在创建结构体后或对象后,在赋值,此时才会走这个方法

  2. linux查看目录下所有文件内容中是否包含某个字符串

    转发自:http://blog.csdn.net/yimingsilence/article/details/76071949 查找目录下的所有文件中是否含有某个字符串 find .|xargs gr ...

  3. Oracle高级查询之OVER

    注释:为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的 oracel的高级用法:rank()/dense_rank() over(partition by ...orde ...

  4. Oracle存储过程in、out、in out 模式参数

    Oracle存储过程in.out.in out 模式参数 标签: oracle存储inout参数 2016-11-14 11:59 3272人阅读 评论(0) 收藏 举报  分类: oracle(7) ...

  5. IDEA 的基本介绍

    1.工具界面 (1)工程下的 src 类似于 Eclipse 下的 src 目录, 用于存放代码. (2)工程下的.idea 和 project01.iml 文件都是 IDEA 工程特有的.类似于 E ...

  6. python基础易错题

    1.以下代码输入什么: class Person: a = 1 def __init__(self): pass def getAge(self): print(__name__) p = Perso ...

  7. VS2010下MFC的串口编程

    串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串 ...

  8. 6.26实力测试(小错笑cry)

    6.26测试 本次考试的粗心不忍吐槽(自带贴吧喷水表情),本次考试主要考察的知识点如下: 算法的分析与精简 暴力枚举输出字符 判断与枚举的综合考察 题目 第一题 [问题描述] 在一口井里,有一只神牛( ...

  9. html里<div> <br /> <p>三者区别

    一.语法不同   -   TOP div和p是成对组合闭合标签:<br />是单一的闭合标签. 以<div>开始,</div>结束:以<p>开始,< ...

  10. hook 9大类

    HOOK技术主要分为两大类,一是内核层HOOK,一是用户层HOOK. 用户层HOOK也就是在ring3环境下hook kenerl32.dll.User3.dll.Gui32.dll.Advapi.d ...