这题一看就觉得是生成函数的题...

我们不妨去推下此题的生成函数,设生成函数为$F(x)$,则$[x^s]F(x)$即为答案。

根据题意,我们得到 $F(x)=x+\sum_{i∈D} F^i(x)$,其中前面单独出现的$x$可以理解为空树的情况。

如果$i$的范围很小,那么我们就可以用求根公式去解多项式方程23333。

然而考虑到$i$最大为$10^5$,根据阿贝尔定理,无根式解,所以不能用此方法。

我们对原先的式子做一个移项,得$F(x)-\sum_{i∈D} F^i(x)=x$。

我们构造函数$G(x)=x-\sum_{i∈D}x^i$。

不难发现$G(F(x))=F(x)-\sum_{i∈D}F^i(x)=x$。也就是说$F(x)$和$G(x)$互为反函数。

然后我们现在已知$G(x)$,要求$F(x)$使得$G(F(x))=x$。也就是求$G(x)$的复合逆。

根据拉格朗日反演,若$G(F(x))=x$,则有$[x^s]F(x)=\dfrac{1}{s}[x^{-1}]\dfrac{1}{G^s(x)}$。

然后,我们对式子乘上$x^s$,得到$[x^s]F(x)=\dfrac{1}{s}[x^{s-1}](\dfrac{1}{G(x)})^s$。

然后后面就是多项式快速幂了。

 #include<bits/stdc++.h>
#define G 7
#define L long long
#define MOD 950009857
#define inv(x) pow_mod(x,MOD-2)
#define M 1<<18
using namespace std; L pow_mod(L x,L k){
L ans=;
while(k){
if(k&) ans=ans*x%MOD;
k=k>>; x=x*x%MOD;
}
return ans;
} void change(L a[],int n){
for(int i=,j=;i<n-;i++){
if(i<j) swap(a[i],a[j]);
int k=n>>;
while(j>=k) j-=k,k>>=;
j+=k;
}
}
void NTT(L a[],int n,int on){
change(a,n);
for(int h=;h<=n;h<<=){
L wn=pow_mod(G,(MOD-)/h);
for(int j=;j<n;j+=h){
L w=;
for(int k=j;k<j+(h>>);k++){
L u=a[k],t=a[k+(h>>)]*w%MOD;
a[k]=(u+t)%MOD;
a[k+(h>>)]=(u-t+MOD)%MOD;
w=w*wn%MOD;
}
}
}
if(on==-){
L inv=inv(n);
for(int i=;i<n;i++) a[i]=a[i]*inv%MOD;
reverse(a+,a+n);
}
} void getinv(L a[],L b[],int n){
if(n==) return void(b[]=inv(a[]));
static L A[M],B[M];
memset(A,,sizeof(A)); memset(B,,sizeof(B));
getinv(a,B,n>>);
for(int i=;i<n;i++) A[i]=a[i];
NTT(A,n<<,); NTT(B,n<<,);
for(int i=;i<(n<<);i++) b[i]=(*B[i]-A[i]*B[i]%MOD*B[i]%MOD+MOD)%MOD;
NTT(b,n<<,-);
for(int i=;i<n;i++) b[n+i]=;
} void qiudao(L a[],L b[],int n){
memset(b,,sizeof(b));
for(int i=;i<n;i++) b[i-]=i*a[i]%MOD;
}
void jifen(L a[],L b[],int n){
memset(b,,sizeof(b));
for(int i=;i<n;i++) b[i+]=a[i]*pow_mod(i+,MOD-)%MOD;
} void getln(L a[],L b[],int n){
static L c[M],d[M];
memset(c,,M<<); memset(d,,M<<);
qiudao(a,c,n); getinv(a,d,n);
NTT(c,n<<,); NTT(d,n<<,);
for(int i=;i<(n<<);i++) c[i]=c[i]*d[i]%MOD;
NTT(c,n<<,-);
jifen(c,b,n);
} void getexp(L a[],L b[],int n){
if(n==){b[]=; return;}
static L lnb[M]; memset(lnb,,M<<);
getexp(a,b,n>>); getln(b,lnb,n);
for(int i=;i<n;i++) lnb[i]=(a[i]-lnb[i]+MOD)%MOD;
lnb[n]=;
lnb[]=(lnb[]+)%MOD;
NTT(lnb,n<<,); NTT(b,n<<,);
for(int i=;i<(n<<);i++) b[i]=b[i]*lnb[i]%MOD;
NTT(b,n<<,-);
for(int i=;i<n;i++) b[i+n]=;
} L g[M]={},f[M]={}; void pow_mod(L a[],L b[],int n,int k){
memset(b,,M<<);
getln(a,b,n);
for(int i=;i<n;i++) a[i]=b[i]*k%MOD;
memset(b,,M<<);
getexp(a,b,n);
} int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int x; scanf("%d",&x);
g[x-]=-;
}
g[]=;
int nn=;while(nn<n) nn<<=;
getinv(g,f,nn);
memset(g,,sizeof(g));
pow_mod(f,g,nn,n);
L ans=inv(n)*g[n-]%MOD;
cout<<ans<<endl;
}

【bzoj3684】 大朋友和多叉树 生成函数+多项式快速幂+拉格朗日反演的更多相关文章

  1. BZOJ3684 大朋友和多叉树(多项式相关计算)

    设$f(x)$为树的生成函数,即$x^i$的系数为根节点权值为$i$的树的个数.不难得出$f(x)=\sum_{k\in D}f(x)^k+x$我们要求这个多项式的第$n$项,由拉格朗日反演可得$[x ...

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

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

  3. 【xsy2479】counting 生成函数+多项式快速幂

    题目大意:在字符集大小为$m$的情况下,有多少种构造长度为$n$的字符串$s$的方案,使得$C(s)=k$.其中$C(s)$表示字符串$s$中出现次数最多的字符的出现次数. 对$998244353$取 ...

  4. bzoj3684: 大朋友和多叉树(拉格朗日反演+多项式全家桶)

    题面 传送门 题解 首先你得知道什么是拉格朗日反演->这里 我们列出树的个数的生成函数 \[T(x)=x+\prod_{i\in D}T^i(x)\] \[T(x)-\prod_{i\in D} ...

  5. BZOJ3992 [SDOI2015]序列统计 【生成函数 + 多项式快速幂】

    题目 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数 列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问题 ...

  6. BZOJ 3684: 大朋友和多叉树 [拉格朗日反演 多项式k次幂 生成函数]

    3684: 大朋友和多叉树 题意: 求有n个叶子结点,非叶节点的孩子数量\(\in S, a \notin S\)的有根树个数,无标号,孩子有序. 鏼鏼鏼! 树的OGF:\(T(x) = \sum_{ ...

  7. 【BZOJ3684】大朋友和多叉树(拉格朗日反演)

    题目链接 题意 求满足如下条件的多叉树个数: 1.每一个点的儿子个数在给定的集合 \(S\) 内 2.总的叶子节点树为 \(s\) 儿子之间有顺序关系,但节点是没有标号的. Sol 拉格朗日反演板子题 ...

  8. BZOJ 3684 大朋友和多叉树

    BZOJ 3684 大朋友和多叉树 Description 我们的大朋友很喜欢计算机科学,而且尤其喜欢多叉树.对于一棵带有正整数点权的有根多叉树,如果它满足这样的性质,我们的大朋友就会将其称作神犇的: ...

  9. [SDOI2015]序列统计(多项式快速幂)

    题目描述 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问 ...

随机推荐

  1. Python GUI 编程

    Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的 ...

  2. 2018.09.22 牧场的安排(状压dp)

    描述 农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12)个 格子.他想在那里的一些格子中种植美味的玉米.遗憾的是,有些 ...

  3. yii2 ActiveRecord的生命周期

    AR的生命周期 http://www.yii-china.com/doc/guide/db_active_record.html 理解AR的生命周期对于你操作数据库非常重要.生命周期通常都会有些典型的 ...

  4. 马婕 2014年MBA,mpacc备考 报刊宣读2 美国对互联网的控制威胁着网络自由(转)

    http://blog.sina.com.cn/s/blog_3e66af4601015qmk.html US controls threaten Internet freedom 美国对互联网的控制 ...

  5. 关于Windbg Local kernel debugging for Win7

    在使用Windbg的时候,如果在Win7上使用Kernel Debug时候会弹出下面的对话框: 在这个对话框中所描述的信息中我们可以看到这么一段话: “Local kernel debugging i ...

  6. HDU 3472 混合图欧拉回路 + 网络流

    九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/13799337 题意: T个测试数据 n串字符 能否倒过来用(1表示能倒着用) 问 ...

  7. alpha七天冲刺计划(更新ing)

    alpha七天冲刺计划 第一天: http://note.youdao.com/noteshare?id=ff0c24feec21b1d74a176a0d88815933 第二天: http://no ...

  8. Dwz(J-UI)框架--入门

    http://www.cnblogs.com/chenyongsai/p/4933982.html Dwz(J-UI)框架--入门 一.了解 概述:是中国人自己开发的基于jQuery实现的Ajax R ...

  9. Excel中使用VBA进行度分秒与十进制度的转换

    发现Excel的VBA功能真是批量处理的一把利刃,工作中小试牛刀了一把,将Excel中度分秒形式的坐标批量处理成十进制度形式,处理完后用于GIS展点制图. 原Excel数据如下: VBA代码如下: S ...

  10. 在c#客户端程序中使用log4net

    为什么使用log4net 有些日志语句只是在开发中用于调试的,不应该在Release版本中输出,log4net通过配置文件可以为Debug和Release不同的模式设置不同的输出级别来控制,而且如果已 ...