博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3684 大朋友和多叉树(多项式相关计算)
阅读量:4322 次
发布时间:2019-06-06

本文共 1623 字,大约阅读时间需要 5 分钟。

设$f(x)$为树的生成函数,即$x^i$的系数为根节点权值为$i$的树的个数。

不难得出$f(x)=\sum_{k\in D}f(x)^k+x$
我们要求这个多项式的第$n$项,由拉格朗日反演可得
$[x^n]f(x)=\frac1n[x^{n-1}](\frac x{g(x)})^n$
其中$[x^n]f(x)$表示$f(x)$的$n$次项系数。
$f(x)$是$g(x)$的复合逆,即$g(f(x))=x$
在本题中,$g(x)=x-\sum_{k\in D}x^k$
我们需要多项式求逆和多项式快速幂。
多项式求逆就不介绍了,多项式快速幂一种朴素的做法是倍增+NTT,复杂度是$O(n\log n\log k)$
有没有更快的做法呢?
观察到$f(x)^n=e^{n\ln(f(x))}$,所以我们只需要快速算$\ln(f(x))$及$e^{f(x)}$即可。
注意$f(x)$的常数项要为1,还好出题人良心保证了这一点。
Part 1:如何算$\ln(f(x))$?
设$g(x)=\ln(f(x))$,那么$g'(x)=\frac{f'(x)}{f(x)}$,所以$g(x)=\int\frac{f'(x)}{f(x)}$,时间复杂度$O(n\log n)$
Part 2:如何算$e^{f(x)}$?
还是考虑倍增,假设我已经求出$g_0(x)=e^{f(x)}(mod\;x^n)$,要求$g(x)=e^{f(x)}(mod\;x^{2n})$
根据泰勒展开,有$$0=h(g(x))=\sum_{i=0}^{\infty}\frac{h^{(i)}(g_0(x))}{i!}(g(x)-g_0(x))^i$$当$i>1$时,上式$mod\;x^{2n}$为$0$
所以$0=h(g_0(x))+h'(g_0(x))(g(x)-g_0(x))\;(mod\;x^{2n})$
即$g(x)=g_0(x)-\frac{h(g_0(x))}{h'(g_0(x))}(mod\;x^{2n})$
其中$h(g(x))=\ln(g(x))-f(x)$
所以$g(x)=g_0(x)-\frac{\ln(g_0(x))-f(x)}{\frac 1{g_0(x)}}=g_0(x)(1-\ln(g_0(x))+f(x))\;(mod\;x^{2n})$
时间复杂度$O(n\log n)$

#include 
#include
#include
#define pre m=n<<1; for(int i=0;i
>1]>>1)|((i&1)<
>=1,a=a*a%p) if(b&1) r=r*a%p; return r;}void ntt(int *a,int n,int f) { for(int i=0;i
i) std::swap(a[i],a[r[i]]); for(int i=1;i
<<=1) for(int j=0,wn=pw(7,((p-1)/(i*2)*f+p-1)%(p-1));j
<<1) for(int k=0,w=1;k
>1,l-1),memcpy(t,f,sizeof(int)*n),memset(t+n,0,sizeof(int)*n),pre;ntt(t,m,1),ntt(g,m,1); for(int i=0;i
>1,l-1),memset(t,0,sizeof(int)*n*2),ln(g,t,t2,n,l); for(int i=0;i

转载于:https://www.cnblogs.com/juruolty/p/6947446.html

你可能感兴趣的文章
Selenium自动化-调用Mysql数据库
查看>>
项目一
查看>>
Framework/base 下添加自定义模块的步骤
查看>>
[转载]AAF灵便应用框架简介系列(6):休息一下,泛谈面向对象 Why OO+多层结构?...
查看>>
android EditView ime
查看>>
关于OpenXml SpreadSheet列宽根据内容的Auto-suitability
查看>>
javascript 学习随笔7
查看>>
<P>标签小细节
查看>>
Linux 命令 - netstat
查看>>
安卓模拟器genymotion安装
查看>>
C 语言中包含的标准头文件(24个)
查看>>
移动硬盘启动盘制作
查看>>
mac 关闭&&显示隐藏文件命令
查看>>
Altium Designer 10 导出文件(PDF,gerber,BOM)
查看>>
&spi1 , spi1 = &spi1; status = "okay"
查看>>
mysql备份与还原 数据库的常用命令。
查看>>
完成登录与注册页面的前端
查看>>
NIO学习之Channel
查看>>
两分布间距离的度量:MMD、KL散度、Wasserstein 对比
查看>>
HDU 1300 Pearls (DP)
查看>>