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

我们不妨去推下此题的生成函数,设生成函数为$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. Angular 通过注入 $location 获取与修改当前页面URL

    //1.获取当前完整的url路径 var absurl = $location.absUrl(); //http://172.16.0.88:8100/#/homePage?id=10&a=1 ...

  2. java实现从url路径中下载pdf文档到本地

    package com.cellstrain.icell.util; import java.io.*;import java.net.*; public class DownloadPdf { /* ...

  3. 一个 图片 滚动 飞入的css特效

    @keyframes bounceInLeft { from, 60%, 75%, 90%, to {animation-timing-function: cubic-bezier(0.215, 0. ...

  4. hdu-1711(kmp算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 思路:kmp模板,注意用scanf,不然超时. #include<iostream> ...

  5. UVa 1639 Candy (数学期望+组合数学+高精度存储)

    题意:有两个盒子各有n个糖,每次随机选一个(概率分别为p,1-p),然后吃掉,直到有一次,你打开盒子发现,没糖了! 输入n,p,求另一个盒子里糖的个数的数学期望. 析:先不说这个题多坑,首先要用lon ...

  6. Windows10和CentOS7双系统安装的一些小技巧

    我个人是先安装好了win10系统,且win10是单独在一个120g的盘里:而centOS7则是安装在另一个500g的磁盘的其中的380g里: 这里要着重注意的是,500g里分成380g的盘不要在win ...

  7. Python中的replace方法

    replace 方法:返回根据正则表达式进行文字替换后的字符串的复制. stringObj.replace(rgExp, replaceText) 参数 stringObj必选项.要执行该替换的 St ...

  8. <a href=“#”>

    在html中看到这样的属性:<a href=“#”>搜了好久,感觉不甚明白,现记之,等遇到了再做补充. # is called an anchor (or hash...). so the ...

  9. swagger 入门

    官网:http://swagger.io/ Swagger UI 下载地址: https://github.com/swagger-api/swagger-ui 文档:README.md ### Do ...

  10. ASP.NET MVC 4 中Razor 视图中JS无法调试

    解决方法 1.首先检查IE中这2个属性是否勾选了. 2.选择IE浏览器进行调试,调试方法有2种     A:采用debugger;的方法,如下图所示: 这时不用调试断点就会在debugger位置中命中 ...