题目链接

题意

求满足如下条件的多叉树个数:
1.每一个点的儿子个数在给定的集合 \(S\) 内
2.总的叶子节点树为 \(s\)

儿子之间有顺序关系,但节点是没有标号的。

Sol

拉格朗日反演板子题。

(似乎不像是个反演)


拉格朗日反演:

用来求 复合逆

如果两个多项式 \(F(x),G(x)\) 满足常数项均为 0,一次项均不为 0,并且 \(G(F(x))=x\),那么称 \(F(x)\) 与 \(G(x)\) 互为复合逆(其实就是反函数)。
其中 \(F(x)\) 和 \(G(x)\) 可以互换。

结论如下:

\[[x^n]F(x)=\frac{1}{n}[x^{-1}]\frac{1}{G^n(x)}\]

证明工作及实际做法:

这个式子里怎么有 \(x^{-1}\) 啊...据说是抽象代数里的,直接懵逼。

先不管这些,假装我们允许下标为负,先来随便乱推一下这个式子。

\[G(F(x))=x\]

\[\sum_{i=1}a_iF^i(x)=x\]

这里写成了形式幂级数的形式。
我们两边对 \(x\) 求导。

\[\sum_{i=1}ia_iF^{i-1}(x)F'(x)=1\]

两边同时除掉 \(F^n(x)\),取 \([x^{-1}]\)(我也不知道我在干什么)
\[[x^{-1}]\sum_{i=1}ia_iF^{i-n-1}(x)F'(x)=[x^{-1}]\frac{1}{F^n(x)}\]

当 \(i\neq n\) 时,\(F^{i-n-1}(x)F'(x)=\dfrac{\big(F^{i-n}(x)\big)'}{i-n}\)

求导后 \(x^{-1}\) 项系数一定是 0。
所以只考虑 \(i=n\) 的情况。

这时
\[F^{-1}(x)F'(x)=\dfrac{\sum_{i=1} ia_ix^{i-1}}{\sum_{i=1}a_ix^i}\]

\[F^{-1}(x)F'(x)=\dfrac{\sum_{i=1} ia_ix^{i-1}}{a_1x}·\dfrac{1}{1+\sum_{i=1}\frac{a_{i+1}}{a_1}x^i} \]

后面那个多项式能够求逆,它的逆的常数项显然为 1,因此不存在 \(-1\) 次方项。
而前面那个多项式的 \([x^{-1}]\) 就是 : \(\frac{a_1}{a_1}=1\)
所以 : \([x^{-1}] F^{-1}(x)F'(x)=1\)

所以由之前的式子:
\([x^{-1}]na_nF^{-1}(x)F'(x)=[x^{-1}]\frac{1}{F^n(x)}\)

那么就证完了:
\[a_n=\frac{1}{n}[x^{-1}]\frac{1}{F^n(x)}\]

但是我们并没有办法直接求解 \([x^{-1}]\),所以我们可以把下标移动一下。
\[a_n=\frac{1}{n}[x^{n-1}]\frac{x^n}{F^n(x)}\]
这里面乘了个 \(x^n\),哪里来的 \(x^{n-1}\) 系数啊,然后\(F(x)\)还没有逆我怎么求啊 \(QAQ\)

注意到 \(F(x)\) 常数项为 \(0\),而一次项不为 \(0\)

于是乎:
\[a_n=\frac{1}{n}[x^{n-1}]\frac{1}{\big(\frac{F(x)}{x}\big)^n}\]
这个好像就有 \(x^{n-1}\)了,而且还有逆,万事大吉。


回到本题,按照小朋友和二叉树的套路直接弄个生成函数。

设 \(F(x)\) 是生成一棵含 \(i\) 个叶子节点的合法的树的这个数列的生成函数 。

生成方式显然就是把一堆子树组合起来。
\[F(x)=x+\sum_{i\in S}F^i(x)\]
枚举有几个儿子,注意这里我们的下标表示的是叶子个数,所以后面的多项式不用乘上 \(x\) 并且由于一个节点是一个叶子,应该给 \(x^1\) 方项系数加 \(1\)

移个项:

\[F(x)-\sum_{i\in S}F^i(x)=x\]

发现复合函数!
令 \(G(x)=x-\sum_{i\in S}x^i\)
那么:
\[G(F(x))=x\]

我们要求的是\(F(x)\)的第 \(s\) 次方项系数然后就是套公式的事了。

什么你说你不想写 多项式快速幂 ?

注意到我们是在 \(bzoj\) 上进行评测,时间限制是总时间。
所以我们直接写倍增快速幂就能在 \(bzoj\) 上通过此题(OWO)。

#include<bits/stdc++.h>
#define Set(a,b) memset(a,b,sizeof(a))
#define Clear(a,_begin_,_end_) for(int i=_begin_;i<_end_;++i) a[i]=0
using namespace std;
const int N=1e5+10,MAXN=N<<2;
const int mod=950009857,phi=mod-1;
template <typename T> inline void init(T&x){x=0;char ch=getchar();bool t=0;for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=1;for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);if(t) x=-x;return;
}
typedef long long ll;
template<typename T>inline void Inc(T&x,int y){x+=y;if(x>=mod) x-=mod;return;}
template<typename T>inline void Dec(T&x,int y){x-=y;if(x <  0) x+=mod;return;}
template<typename T>inline int fpow(int x,T k){int ret=1;for(;k;k>>=1,x=(ll)x*x%mod) if(k&1) ret=(ll)ret*x%mod;return ret;}
inline int Sum(int x,int y){x+=y;if(x>=mod) return x-mod;return x;}
inline int Dif(int x,int y){x-=y;if(x < 0 ) return x+mod;return x;}
int rader[MAXN],wn[30],iwn[30],Inv[MAXN];
inline void Calc(){for(int i=0;i<30;++i) wn[i]=fpow(7,phi/(1<<i)),iwn[i]=fpow(wn[i],mod-2);Inv[1]=1;for(int i=2;i<MAXN;++i) Inv[i]=(ll)(mod-mod/i)*Inv[mod%i]%mod;return;
}
inline int Init(int n){int len=1,up=-1;while(len<=n)len<<=1,++up;for(int i=1;i<len;++i) rader[i]=(rader[i>>1]>>1)|((i&1)<<up);return len;}
inline void NTT(int*A,int n,int f){for(int i=1;i<n;++i) if(rader[i]>i) swap(A[i],A[rader[i]]);for(int i=1,h=1;i<n;++h,i<<=1){int W= (~f) ? wn[h]:iwn[h];for(int j=0,p=i<<1;j<n;j+=p)for(int w=1,k=0;k<i;++k,w=(ll)W*w%mod){int X=A[j|k],Y=(ll)w*A[j|k|i]%mod;A[j|k]=Sum(X,Y),A[j|k|i]=Dif(X,Y);}}if(!~f) for(int i=0;i<n;++i) A[i]=(ll)A[i]*Inv[n]%mod;
}
int n,m;
inline void Poly_Inv(int*F,int*I,int n){if(n==1) {I[0]=1;return;}Poly_Inv(F,I,(n+1)>>1);int len=Init(n<<1);static int A[MAXN];for(int i=0;i<n;++i) A[i]=F[i];Clear(A,n,len);NTT(A,len,1);NTT(I,len,1);for(int i=0;i<len;++i) I[i]=Dif(2ll*I[i]%mod,(ll)I[i]*I[i]%mod*A[i]%mod);NTT(I,len,-1);Clear(I,n,len);return;
}
int main()
{Calc();init(n),init(m);static int A[MAXN],G[MAXN];int x;for(int i=1;i<=m;++i) init(x),A[x-1]=phi;A[0]=1;int k=n;G[0]=1;int len=Init(n<<1);while(k) {NTT(A,len,1);if(k&1) {NTT(G,len,1);for(int i=0;i<len;++i) G[i]=(ll)G[i]*A[i]%mod;NTT(G,len,-1);Clear(G,n,len);}for(int i=0;i<len;++i) A[i]=(ll)A[i]*A[i]%mod;NTT(A,len,-1);Clear(A,n,len);k>>=1;}Set(A,0);Poly_Inv(G,A,n);int ans=(ll)A[n-1]*Inv[n]%mod;cout<<ans<<endl;return 0;
}

转载于:https://www.cnblogs.com/NeosKnight/p/10694367.html

【BZOJ3684】大朋友和多叉树(拉格朗日反演)相关推荐

  1. [BZOJ3684]大朋友和多叉树

    设答案为$f_s$,它的生成函数为$\begin{align*}F(x)=\sum\limits_{i=0}^\infty f_ix^i\end{align*}$,则我们有$\begin{align* ...

  2. 【BZOJ3684】大朋友和多叉树【生成函数】【拉格朗日反演】【多项式幂函数】

    传送门 题意:给定nnn和集合SSS,求含nnn个叶子结点.非叶子节点的儿子数在SSS内的树的个数 模 950009857(453×221+1)950009857(453\times2^{21}+1) ...

  3. 【LOJ6363】「地底蔷薇」【点双】【指数型生成函数】【扩展拉格朗日反演】【多项式幂函数】

    传送门 题意:给定nnn和集合SSS,求出nnn个点的「所有极大点双连通分量的大小都在SSS 内」的不同简单无向连通图的个数 模 998244353998244353998244353. n,∑i∈S ...

  4. 摩托罗拉多开助手by IM大朋友

    软件针对摩托罗拉edges进行适配 分身前请先推送/安装手机端助手并打开[懒得理] 否则电脑端将无法获取应用信息 熟悉adb的也可以直接使用指令[针不戳] 软件开发不易,欢迎关注.[受虐滑稽] 视频教 ...

  5. 【CSA35G】【XSY3318】Counting Quests DP 拉格朗日反演 NTT

    题目大意 zjt 是个神仙. 一天,zjt 正在和 yww 玩猜数游戏. zjt 先想一个 \([1,n]\) 之间的整数 \(x\),然后 yww 开始向他问问题. yww 每次给 zjt 一个区间 ...

  6. 《算法竞赛中的初等数论》(四)正文 0x40反演(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  7. [学习笔记]多项式与有标号简单图计数

    学了一天的有标号无向图计数真的自闭了- 本篇文章是基于2019WC汪乐平大佬的讲课课件<生成函数,多项式算法与图的计数>编写的. 注意:文中所有生成函数都规定为指数型生成函数(EGF),请 ...

  8. 生成函数入门及应用 生成函数

    说实话这东西至少得学一天-- 普通型生成函数 OGF 数列 f ( x ) = a x f(x)=a_x f(x)=ax​的普通型生成函数为 g ( x ) = ∑ i = 0 ∞ a i x i g ...

  9. 有关多项式处理的各种算法总结

    有关多项式处理的各种算法总结 有关多项式处理的各种算法总结 前言 1.一些定义的简要介绍 2.牛顿迭代 3.多项式求逆 4.多项式求lnln\ln 5.多项式开方 6.多项式求指数函数(exp) 7. ...

最新文章

  1. 【OpenCV3】级联分类器目标检测——cv::CascadeClassifier简介
  2. Python之列表表达式及高阶函数lamda、zip、enumerate、map和filter方法
  3. java swftools linux_swftools linux下安装
  4. rest api如何创建_创建一个安全的Spring REST API
  5. Android--Facebook Login without LoginButton
  6. vijos-1003等价表达式
  7. Keras(六)Autoencoder 自编码 原理及实例 Savereload 模型的保存和提取
  8. 计算方法(一):误差
  9. sql往数据库里面添加数据
  10. WSL2 网络异常排查 [ping 不通、网络地址异常、缺少默认路由、被宿主机防火墙拦截]
  11. 在线License管理系统(支持离线授权)
  12. 10分钟带你进入Swagger的世界,快来看一看吧
  13. 使用激光可调湿蚀刻曲面实现无间隙微透镜阵列的通用
  14. linux 字符 拨号上网,LINUX下用ADSL拨号上网
  15. windows写注册表文件脚本的编写
  16. u8 客户端修改服务器地址,u8服务器地址怎么修改
  17. 奇虎360私有化背后隐现信托身影
  18. Objective-C和C/C++混合编译
  19. php网页可视化编辑器,在线HTML可视化编辑器KindEditor | 严佳冬
  20. jQueryanimation实现漂流瓶扔和写动画效果

热门文章

  1. 用css3的@keyframes里设置transform:rotate(); 当控制动画暂停:animation-play-state:paused暂停,在微信和safari里无效...
  2. 数学(FFT):BZOJ 3527 [Zjoi2014]力
  3. monkey测试小结
  4. Java 中Iterator 、Vector、ArrayList、List 使用深入剖析
  5. Flutter 实现微信摇一摇的功能 Flutter 加速度感应
  6. Flutter TabBar 标签栏背景颜色、点击水波纹颜色配置
  7. flutter 一个用户登录页面
  8. 设置 webbrowser 控件的表现形式,可以像你本机的IE浏览器一样
  9. Highcharts改Y轴的刻度值
  10. HDU 3377 插头dp