传送门


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

注意到选出一棵合法的二叉树,只需要选择一个合法的权值作为根的权值,选择一棵合法的二叉树(可以为空)作为根的左儿子,选择一棵合法的二叉树(可以为空)作为根的右儿子即可。那么有\(F(x) - 1 = F(x) * F(x) * C(x)\),左边\(-1\)的原因是选出来的二叉树不可能权值和为\(0\)。

化简得到\(C(x)F^2(x) - F(x) + 1 = 0\),由初中知识得到\(F(x) = \frac{1 \pm \sqrt{1 - 4C(x)}}{2C(x)} = \frac{2}{1 \mp \sqrt{1 - 4C(x)}}\)

注意\([x^0]C(x) = 0\),所以\(C(x)\)不存在逆,所以必须上下同乘\(1 \mp \sqrt{1 - 4C(x)}\)把\(C(x)\)约掉。

但是现在仍然有\(2\)个答案。注意到,\([x^0](1 - \sqrt{1 - 4C(x)})=0\)不存在逆,而\(1 + \sqrt{1 - 4C(x)}\)存在逆,所以\(F(x) = \frac{2}{1 + \sqrt{1 - 4C(x)}}\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<stack>
#include<vector>
#include<cmath>
#include<random>
#include<cassert>
//This code is written by Itst
using namespace std;const int mod = 998244353;
inline int read(bool flg = 0){int a = 0;char c = getchar();bool f = 0;while(!isdigit(c) && c != EOF){if(c == '-')f = 1;c = getchar();}if(c == EOF)exit(0);while(isdigit(c)){if(flg)a = (a * 10ll + c - 48) % mod;elsea = a * 10 + c - 48;c = getchar();}if(flg) a += mod;return f ? -a : a;
}const int MAXN = (1 << 19) + 7 , MOD = 998244353;
#define PII pair < int , int >
#define st first
#define nd secondPII mul(PII a , PII b , int val){return PII((1ll * a.st * b.st + 1ll * a.nd * b.nd % MOD * val) % MOD , (1ll * a.st * b.nd + 1ll * a.nd * b.st) % MOD);
}int poww(PII a , int b , int val){PII cur = PII(1 , 0);while(b){if(b & 1) cur = mul(cur , a , val);a = mul(a , a , val);b >>= 1;}return cur.st;
}inline int poww(long long a , int b){int times = 1;while(b){if(b & 1)times = times * a % MOD;a = a * a % MOD;b >>= 1;}return times;
}int calc_Surplus(int x){mt19937 rnd(time(0));int a = rnd() % MOD;while(poww((1ll * a * a - x + MOD) % MOD , (MOD - 1) / 2) != MOD - 1)a = rnd() % MOD;return poww(PII(a , 1) , (MOD + 1) / 2 , (1ll * a * a - x + MOD) % MOD);
}namespace poly{const int G = 3 , INV = (MOD + 1) / G;int A[MAXN] , B[MAXN] , C[MAXN] , D[MAXN] , E[MAXN];int a[MAXN] , b[MAXN] , c[MAXN] , d[MAXN];int need , inv , dir[MAXN] , _inv[MAXN];
#define clear(x) memset(x , 0 , sizeof(int) * need)void init(int len){need = 1;while(need < len)need <<= 1;inv = poww(need , MOD - 2);for(int i = 1 ; i < need ; ++i)dir[i] = (dir[i >> 1] >> 1) | (i & 1 ? need >> 1 : 0);}void init_inv(){_inv[1] = 1;for(int i = 2 ; i < MAXN ; ++i)_inv[i] = MOD - 1ll * (MOD / i) * _inv[MOD % i] % MOD;}void NTT(int *arr , int type){for(int i = 1 ; i < need ; ++i)if(i < dir[i])arr[i] ^= arr[dir[i]] ^= arr[i] ^= arr[dir[i]];for(int i = 1 ; i < need ; i <<= 1){int wn = poww(type == 1 ? G : INV , (MOD - 1) / i / 2);for(int j = 0 ; j < need ; j += i << 1){long long w = 1;for(int k = 0 ; k < i ; ++k , w = w * wn % MOD){int x = arr[j + k] , y = arr[i + j + k] * w % MOD;arr[j + k] = x + y >= MOD ? x + y - MOD : x + y;arr[i + j + k] = x < y ? x + MOD - y : x - y;}}}}void mul(int *a , int *b){NTT(a , 1);NTT(b , 1);for(int i = 0 ; i < need ; ++i)a[i] = 1ll * a[i] * b[i] % MOD;NTT(a , -1);}void getInv(int *a , int *b , int len){if(len == 1){b[0] = poww(a[0] , MOD - 2);return;}getInv(a , b , (len + 1) >> 1);memcpy(A , a , sizeof(int) * len);memcpy(B , b , sizeof(int) * len);init(len * 3);NTT(A , 1);NTT(B , 1);for(int i = 0 ; i < need ; ++i)A[i] = 1ll * A[i] * B[i] % MOD * B[i] % MOD;NTT(A , -1);for(int i = 0 ; i < len ; ++i)b[i] = (2 * b[i] - 1ll * A[i] * inv % MOD + MOD) % MOD;clear(A);clear(B);}void getSqrt(int *a , int *b , int len){if(len == 1){b[0] = calc_Surplus(a[0]);if(MOD - b[0] < b[0]) b[0] = MOD - b[0];return;}getSqrt(a , b , (len + 1) >> 1);getInv(b , C , len);memcpy(A , a , sizeof(int) * len);init(len * 2);mul(A , C);for(int i = 0 ; i < len ; ++i)b[i] = _inv[2] * (b[i] + 1ll * A[i] * inv % MOD) % MOD;clear(A);clear(C);}
}
using namespace poly;
int F[MAXN] , N , M;int main(){
#ifndef ONLINE_JUDGEfreopen("in","r",stdin);//freopen("out","w",stdout);
#endifinit_inv();N = read() , M = read();for(int i = 1 ; i <= N ; ++i)F[read()] = MOD - 4;F[0] = 1;getSqrt(F , a , M + 1);++a[0];getInv(a , b , M + 1);for(int i = 1 ; i <= M ; ++i)printf("%d\n" , b[i] * 2 % MOD);return 0;
}

转载于:https://www.cnblogs.com/Itst/p/10628443.html

CF438E The Child and Binary Tree 生成函数、多项式开根相关推荐

  1. CF438E The Child and Binary Tree(有意思的生成函数 + 多项式求逆 + 多项式开方)

    整理的算法模板合集: ACM模板 点我看多项式全家桶(●^◡_◡◡​^●) CF438E The Child and Binary Tree 简单的黑题 首先我们发现模数为99824435399824 ...

  2. E. The Child and Binary Tree(生成函数 + 多项式)

    E. The Child and Binary Tree 不难写出一个递推式fn=∑i=1ngi∑j=0n−ifjfn−i−jf_n = \sum\limits_{i = 1} ^{n}g_i \su ...

  3. [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: 2 ...

  4. CF438E:The Child and Binary Tree(生成函数)

    解析: 设计 fif_ifi​ 表示权值为 iii 的方案数,f0=1f_0=1f0​=1. 枚举根节点权值,可以写出转移: fn=∑gk∑ififn−k−i=∑i+j+k=nfifjgkf_n=\s ...

  5. CF438E-The Child and Binary Tree【生成函数】

    正题 题目链接:https://www.luogu.com.cn/problem/CF438E 题目大意 每个节点有nnn个权值可以选择,对于1∼m1\sim m1∼m中的每个数字kkk,求权值和为k ...

  6. bzoj 3625(CF 438E)The Child and Binary Tree——多项式开方

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3625 http://codeforces.com/contest/438/problem/E ...

  7. [学习笔记]多项式开根

    还是倍增思想 每一层 还要套一个多项式求逆 所以O(nlog^2n),常数也不小 数组比较多 再trick一下 得到: $T=(T'+F*inv(T'))*inv2$ 可以只算一次多项式求逆,一次NT ...

  8. 洛谷 5205 【模板】多项式开根

    题目:https://www.luogu.org/problemnew/show/P5205 不会二次剩余. 牛顿迭代推开根式子: \( f^2(x)-g(x)=0 \) \( f(x)=f_0(x) ...

  9. 生成函数多项式操作合集

    一.生成函数与多项式乘法. 众所周知,生成函数是OI中的计数利器,而很多生成函数的题目需要快速计算式子中的多项式运算,所以本篇主要是介绍多项式运算的. 值得注意的是,这里很多奇怪的多项式运算本来是不存 ...

最新文章

  1. 秒抢红包的背后,是复杂的即时付款系统
  2. Exchange2010 初始化失败
  3. c++中new和delete的使用方法
  4. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)
  5. 将特定像素点在图像上连接起来_图像分割【论文解读】快速图像分割的SuperBPD方法 CVPR-2020...
  6. 合并excel文件 C语言,再见Ctrl + C!合并100个Excel表格,只需30秒!
  7. 写博客的这几个月,获益良多
  8. 华为cor—al10_cor al10是华为什么型号 cor al10是华为啥型号
  9. C++(7)--for循环,break,continue语句
  10. 人工智能产业链深度透析—产业应用医疗篇
  11. Linux环境下gcc静态编译/usr/bin/ld: cannot find -lc错误原因及解决方法。
  12. 金蝶中间件中标国家金质工程
  13. 项目管理工具project软件学习(七) - 创建资源,分配资源、查看资源负荷
  14. Qt Creator插件ToDo
  15. mysql chunk_【MySQL参数】-innodb_buffer_pool_chunk_size
  16. csapp 大作业 hello的自白
  17. 计算机图书应分为书法的什么类,计算机书法创作模拟与渲染研究-计算机应用技术专业论文.docx...
  18. 关于“尺蠖(huò)效应”
  19. 读书笔记-天才和凡人
  20. CAD(dxf、dwg格式)文件的读取和显示,真正实现通过代码预览CAD文件,包含解析dwg、dxf文件,可以提取标注信息,可以转换为pdf、png、tiff、gif等6种格式的文件,可以永久免费实用

热门文章

  1. 交叉编译Open***-2.4.3
  2. [Spring MVC] - @ModelAttribute使用
  3. HTML5 LocalStorage 本地存储JSON数据
  4. webdriver+python 对三大浏览器的支持
  5. 未能为数据库 '*'中得对象'*'分配空间,因文件组'PRIMARY'已满
  6. django 学习笔记(一)
  7. 四、物理优化(2)索引视图
  8. windows ubuntu Android studio安装好启动没反应解决方法
  9. puppet最新源码包安装学习笔记
  10. 如何对自己做好正确的人生规划