题目大意

给定n种权值

给定m

\(F_i表示权值和为i的二叉树个数\)

求\(F_1,F_2...F_m\)

分析

安利博客

\(F_d=F_L*F_R*C_{mid},L+mid+R=d\)

\(F(x)=\frac {1+\sqrt{1-4C(x)}}{2C(x)}=\frac 2{1-\sqrt{1-4C(x)}}\)

无解是因为\(x=0\)时\(F(x)=1\)

但是\(\lim\limits_{x\rightarrow 0}\)时\(1-\sqrt{1-4C(x)}趋于0\)

\(F\)趋于INF

同理可证\(F(x)=\frac {1-\sqrt{1-4C(x)}}{2C(x)}\)是正确的

姿势

求逆和开根函数中

static开一些临时数组

写起来方便

但注意初始化

solution

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int M=262145;
const LL Q=998244353; inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} int n,m;
LL g,ig,iv2;
LL a[M],b[M];
int rev[M]; LL pwr(LL x,LL tms){
LL res=1;
for(;tms>0;tms>>=1){
if(tms&1) res=res*x%Q;
x=x*x%Q;
}
return res;
} void NTT(LL *a,int N,int fl){
int i,j,k;
LL W,Wn,u,v; for(i=0;i<N;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?(N>>1):0);
for(i=0;i<N;i++) if(i<rev[i]) swap(a[i],a[rev[i]]); for(i=2;i<=N;i<<=1){
if(fl==1) Wn=pwr(g,(Q-1)/i);
else Wn=pwr(ig,(Q-1)/i);
for(j=0;j<N;j+=i){
for(W=1,k=j;k<j+i/2;k++,W=W*Wn%Q){
u=a[k];
v=W*a[k+i/2]%Q;
a[k]=(u+v)%Q;
a[k+i/2]=((u-v)%Q+Q)%Q;
}
}
}
if(fl==-1){
LL iN=pwr(N,Q-2);
for(i=0;i<N;i++) a[i]=a[i]*iN%Q;
} } void INV(LL*a,LL *b,int len){
static LL g[M],tp[M];
if(len==1) b[0]=pwr(a[0],Q-2);
else{
int i;
INV(a,b,len>>1);
int N=len<<1;
for(i=0;i<(len>>1);i++) g[i]=b[i];
for(;i<N;i++) g[i]=b[i]=0;
for(i=0;i<len;i++) tp[i]=a[i];
for(;i<N;i++) tp[i]=0;
NTT(g,N,1);
NTT(tp,N,1);
for(i=0;i<N;i++) tp[i]=g[i]*g[i]%Q*tp[i]%Q;
NTT(tp,N,-1);
for(i=0;i<len;i++) b[i]=((2*b[i]%Q-tp[i])%Q+Q)%Q;
}
} void SQR(LL*a,LL *b,int len){
static LL g[M],tp[M],inv_g[M];
if(len==1) b[0]=1;
else{
int i;
SQR(a,b,len>>1);
int N=len<<1;
for(i=0;i<(len>>1);i++) g[i]=b[i]%Q;
for(;i<N;i++) g[i]=b[i]=0;
for(i=0;i<N;i++) inv_g[i]=0;
INV(g,inv_g,len); for(i=0;i<len;i++) tp[i]=a[i];
for(;i<N;i++) tp[i]=0;
NTT(inv_g,N,1);
NTT(tp,N,1);
for(i=0;i<N;i++) tp[i]=inv_g[i]%Q*tp[i]%Q;
NTT(tp,N,-1);
for(i=0;i<len;i++) b[i]=(b[i]+tp[i])%Q*iv2%Q;
}
} int main(){ int i,x;
n=rd(),m=rd();
for(i=1;i<=n;i++){
x=rd();
a[x]-=4;
if(a[x]<0) a[x]+=Q;
}
a[0]++;
for(n=2;n<=m;n<<=1);
g=3;
ig=pwr(3,Q-2);
iv2=pwr(2,Q-2); SQR(a,b,n); b[0]++;
INV(b,a,n); for(i=0;i<=m;i++) a[i]=(2LL*a[i])%Q;
for(i=1;i<=m;i++) printf("%d\n",a[i]);
return 0;
}

bzoj 3625小朋友和二叉树 多项式求逆+多项式开根 好题的更多相关文章

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

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

  2. 2019.01.01 bzoj3625:小朋友和二叉树(生成函数+多项式求逆+多项式开方)

    传送门 codeforces传送门codeforces传送门codeforces传送门 生成函数好题. 卡场差评至今未过 题意简述:nnn个点的二叉树,每个点的权值KaTeX parse error: ...

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

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

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

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

  5. bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...

  6. 【learning】多项式相关(求逆、开根、除法、取模)

    (首先要%miskcoo,这位dalao写的博客(这里)实在是太强啦qwq大部分多项式相关的知识都是从这位dalao博客里面学的,下面这篇东西是自己对其博客学习后的一些总结和想法,大部分是按照其博客里 ...

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

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

  8. 【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln

    题解 分治FFT 设\(f_i\)为\(i\)个点组成的无向图个数,\(g_i\)为\(i\)个点组成的无向连通图个数 经过简单的推导(枚举\(1\)所在的连通块大小),有: \[ f_i=2^{\f ...

  9. P6295-有标号 DAG 计数【多项式求逆,多项式ln】

    正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有\(n\)个点的弱联通\(DAG\)数量. \(1\leq n\leq 10^5\) 解题 ...

随机推荐

  1. NOIP模拟赛 经营与开发 小奇挖矿

    [题目描述] 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以“EX”为开头的英语单词. eXplore(探索) eXpand(拓张与发展) eXploit(经营与开发 ...

  2. NOIP复习之1 数学数论

    noip一轮复习真的要开始啦!!! 大概顺序是这样的 1.数学 2.搜索贪心 3.数据结构 4.图论 5.dp 6.其他 数学 1.数论 数论被称为数学皇冠上的明珠,他的重要性主要在于它是其他学习的祖 ...

  3. matlplotlib根据函数画出图形

    根据函数画出函数的轨迹 import matht = np.linspace(0, math.pi, 1000)x = np.sin(t)y = np.cos(t) + np.power(x, 2.0 ...

  4. C++图书馆管理系统项目中部分功能代码实现(书籍推荐)

    bool UserServiceImpl::Compare1(Book b1,Book b2)//按照借阅次数比较{ if(b1.GetCnt() > b2.GetCnt()) { return ...

  5. 文件处理seek以及修改内容的两种方式

    f.seek(offset,whence)offset代表文件的指针的偏移量,单位是字节byteswhence代表参考物,有三个取值# 0:参照文件的开头# 1:参照当前文件指针所在位置# 2: 参照 ...

  6. Java 编辑html模板并生成pdf

    1.工具类 import com.hujiang.project.zhgd.Util; import com.itextpdf.text.BaseColor; import com.itextpdf. ...

  7. 在ArchLinux、manjaro中安装MySql(mariaDB)

    安装MySql数据库.但是在MySql被Oracle收购之后,很多开源支持者就转而使用MariaDb了.不过MariaDb也和MySql兼容的,所以基本不用有什么担心.由于ArchLinux只带了Ma ...

  8. 爬虫之scrapy工作流程

    Scrapy是什么? scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量代码,就能够快速的抓取到数据内容.Scrapy 使用了 Twisted['twɪstɪd] ...

  9. python基础-面向对象的三大特征

    继承 单继承 父类 基类 子类 派生类 继承:是面向对象软件技术当中的一个概念,如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”. ...

  10. shell中变量字符串的截取 与 带颜色字体、背景输出

    字符串截取 假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值:${file#*/}:删掉第一个 /及其左边的字符串:dir ...