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

传送门

题意:给定nnn和集合SSS,求含nnn个叶子结点、非叶子节点的儿子数在SSS内的树的个数 模 950009857(453×221+1)950009857(453\times2^{21}+1)950009857(453×221+1)。结点无标号但儿子间有顺序。

n≤105n \leq 10^5n105

算是拉格朗日反演模版题了吧……

先是拉格朗日反演

对于两个不含常数项,且一次项非000的多项式F(x),G(x)F(x),G(x)F(x),G(x),如果F(G(x))=xF(G(x))=xF(G(x))=x(当然要取模),称FFFGGG的复合逆。

人话:反函数

根据高中数学知识,F(x)F(x)F(x)G(x)G(x)G(x)互为反函数,所以G(F(x))=xG(F(x))=xG(F(x))=x也成立

所以下面的FFFGGG可以互换

现在考虑G(F(x))=xG(F(x))=xG(F(x))=x,如果知道G(x)G(x)G(x)如何求F(x)F(x)F(x)nnn次项系数


G(x)=∑i=1∞aixiG(x)=\sum_{i=1}^\infin a_ix^iG(x)=i=1aixi

代入F(x)F(x)F(x)

∑i=0∞aiFi(x)=x\sum_{i=0}^\infin a_iF^i(x)=xi=0aiFi(x)=x

闲着没事求个导

∑i=0∞iaiFi−1(x)F′(x)=1\sum_{i=0}^\infin ia_iF^{i-1}(x)F'(x)=1i=0iaiFi1(x)F(x)=1

同时除以Fn(x)F^n(x)Fn(x)

∑i=0∞iaiFi−n−1(x)F′(x)=1Fn(x)\sum_{i=0}^\infin ia_iF^{i-n-1}(x)F'(x)={1\over F^n(x)}i=0iaiFin1(x)F(x)=Fn(x)1

同时取−1-11次项

[x−1]∑i=0∞iaiFi−n−1(x)F′(x)=[x−1]1Fn(x)[x^{-1}]\sum_{i=0}^\infin ia_iF^{i-n-1}(x)F'(x)=[x^{-1}]{1\over F^n(x)}[x1]i=0iaiFin1(x)F(x)=[x1]Fn(x)1

什么?为什么有负数项?

这个涉及到一些抽象代数的知识,这里肯定讲不了了

不过可以简单粗暴的理解成:

两个多项式相除F(x)/G(x)F(x)/G(x)F(x)/G(x),发现G(x)G(x)G(x)没有常数项无法求逆,于是把G(x)G(x)G(x)写成G0(x)xnG_0(x)x^nG0(x)xn,其中G0(x)G_0(x)G0(x)有常数项。

这样G0(x)G_0(x)G0(x)就有逆了,算出来之后平移nnn位就有了负下标,形如

...a−2x−2+a−1x−1+a0+a1x+......a_{-2}x^{-2}+a_{-1}x^{-1}+a_0+a_1x+......a2x2+a1x1+a0+a1x+...

只需要知道:这个负下标是为了解决没有逆的情况,和多项式求逆不矛盾

好继续

[x−1]∑i=0∞iaiFi−n−1(x)F′(x)=[x−1]1Fn(x)[x^{-1}]\sum_{i=0}^\infin ia_iF^{i-n-1}(x)F'(x)=[x^{-1}]{1\over F^n(x)}[x1]i=0iaiFin1(x)F(x)=[x1]Fn(x)1

中间那团看着不爽,提出来研究一下

Fi−n−1(x)F′(x)F^{i-n-1}(x)F'(x)Fin1(x)F(x)

它等于

(Fi−n)′(x)i−n(F^{i-n})'(x)\over i-nin(Fin)(x)

i=ni=ni=n的时候没有意义,考虑i≠ni\neq ni=n

发现这个情况下Fi−nF^{i-n}Fin是个多项式……

什么?为什么?

首先i>ni>ni>n肯定没问题

i<ni<ni<n的时候相当于求个逆再求幂,它就(yi)算(ding)没有逆,我们也有负下标可以用来平移

这样允许负次幂的多项式求导之后一定没有−1-11次项,因为求导相当于集体左移一位,而000次项并不能移到−1-11次项……

(并不知道对不对,感性理解好了)

所以我们只需要考虑i=ni=ni=n的情况

也就是

F−1(x)F′(x)F^{-1}(x)F'(x)F1(x)F(x)

F(x)=∑i=1∞bixiF(x)=\sum_{i=1}^\infin b_ix^iF(x)=i=1bixi

那么上面的式子可以写成

b1+2b2x+3b3x2+4b4x3+...b1x+b2x2+b3x3+b4x4+...b_1+2b_2x+3b_3x^2+4b_4x^3+...\over b_1x+b_2x^2+b_3x^3+b_4x^4+...b1x+b2x2+b3x3+b4x4+...b1+2b2x+3b3x2+4b4x3+...

把下面强行拆开

b1+2b2x+3b3x2+4b4x3+...b1x11+b2b1x+b3b1x2+b4b1x3+...{b_1+2b_2x+3b_3x^2+4b_4x^3+...\over b_1x}{1\over 1+\frac{b_2}{b_1}x+{b_3\over b_1}x^2+{b_4 \over b_1}x^3+...}b1xb1+2b2x+3b3x2+4b4x3+...1+b1b2x+b1b3x2+b1b4x3+...1

注意到右边是一个正宗的多项式,并且常数项为111,存在逆元;而左边的b1b1xb_1\over b_1xb1xb1会贡献出一个x−1x^{-1}x1

所以这一团的−1-11次项为111

代回原式

nan=[x−1]1Fn(x)na_n=[x^{-1}]\frac{1}{F^n(x)}nan=[x1]Fn(x)1

[xn]G(x)=1n[x−1]1Fn(x)[x^n]G(x)=\frac{1}{n}[x^{-1}]\frac{1}{F^n(x)}[xn]G(x)=n1[x1]Fn(x)1

没了……

哎等等,道理我都懂,可是负次幂怎么求呢?

那就右边平移吧

[xn]G(x)=1n[xn−1][xF(x)]n[x^n]G(x)=\frac{1}{n}[x^{n-1}][\frac{x}{F(x)}]^n[xn]G(x)=n1[xn1][F(x)x]n

这样F(x)F(x)F(x)刚好可以约一个xxx,就可以求逆啦


然后这道题就很容易了

f(n)f(n)f(n)表示nnn个叶子时的答案,有f(1)=1f(1)=1f(1)=1

然后构造生成函数F(x)F(x)F(x)

可以得到

F(x)=∑d∈SFd(x)+xF(x)=\sum_{d\in S}F^d(x)+xF(x)=dSFd(x)+x

移个项

F(x)−∑d∈SFd(x)=xF(x)-\sum_{d\in S}F^d(x)=xF(x)dSFd(x)=x

G(x)=x−∑d∈SxdG(x)=x-\sum_{d\in S}x^dG(x)=xdSxd

G(F(x))=xG(F(x))=xG(F(x))=x

套结论即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 400005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
const int MOD=950009857;
typedef long long ll;
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int dec(const int& x,const int& y){return x<y? x-y+MOD:x-y;}
inline int qpow(int a,int p)
{int ans=1;while (p){if (p&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD;p>>=1;}return ans;
}
#define inv(x) qpow(x,MOD-2)
int rt[2][22];
int l,r[MAXN];
inline void init(){for (int i=0;i<(1<<l);i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));}
inline void NTT(int* a,int type)
{int lim=1<<l;for (int i=0;i<lim;i++) if (i<r[i]) swap(a[i],a[r[i]]);for (int L=0;L<l;L++){int mid=1<<L,len=mid<<1,Wn=rt[type][L+1];for (int s=0;s<lim;s+=len)for (int k=0,w=1;k<mid;k++,w=(ll)w*Wn%MOD){int x=a[s+k],y=(ll)a[s+mid+k]*w%MOD;a[s+k]=add(x,y),a[s+mid+k]=dec(x,y);}}if (type){int t=inv(lim);for (int i=0;i<lim;i++) a[i]=(ll)a[i]*t%MOD;}
}
void getinv(int* A,int* B,int n)
{static int f[MAXN],t[MAXN];if (n==1) return (void)(*B=inv(*A));getinv(A,t,(n+1)>>1);l=0;while ((1<<l)<(n<<1)) ++l;init();for (int i=0;i<n;i++) f[i]=A[i];for (int i=n;i<(1<<l);i++) f[i]=t[i]=0;NTT(f,0);NTT(t,0);for (int i=0;i<(1<<l);i++) B[i]=(ll)t[i]*dec(2,(ll)f[i]*t[i]%MOD)%MOD;NTT(B,1);for (int i=n;i<(1<<l);i++) B[i]=0;
}
inline void deriv(int* A,int* B,int n){for (int i=0;i<n-1;i++) B[i]=(ll)A[i+1]*(i+1)%MOD;B[n-1]=0;}
inline void integ(int* A,int* B,int n){for (int i=1;i<n;i++) B[i]=(ll)A[i-1]*inv(i)%MOD;B[0]=0;}
void getln(int* A,int* B,int n)
{static int f[MAXN],g[MAXN];deriv(A,f,n);getinv(A,g,n);for (int i=n;i<(1<<l);i++) f[i]=g[i]=0;NTT(f,0);NTT(g,0);for (int i=0;i<(1<<l);i++) f[i]=(ll)f[i]*g[i]%MOD;NTT(f,1);integ(f,B,n);for (int i=n;i<(1<<l);i++) B[i]=0;
}
void getexp(int* A,int* B,int n)
{static int f[MAXN],g[MAXN];if (n==1) return (void)(*B=1);getexp(A,g,(n+1)>>1);getln(g,f,n);for (int i=0;i<n;i++) f[i]=dec(A[i],f[i]);++f[0];for (int i=n;i<(1<<l);i++) f[i]=g[i]=0;NTT(f,0);NTT(g,0);for (int i=0;i<(1<<l);i++) B[i]=(ll)f[i]*g[i]%MOD;NTT(B,1);for (int i=n;i<(1<<l);i++) B[i]=0;
}
int a[MAXN],t[MAXN];
int main()
{rt[0][21]=qpow(5,453);rt[1][21]=inv(rt[0][21]);for (int i=20;i>=0;i--){rt[0][i]=(ll)rt[0][i+1]*rt[0][i+1]%MOD;rt[1][i]=(ll)rt[1][i+1]*rt[1][i+1]%MOD;}int n,k;n=read(),k=read();a[0]=1;while (k--) a[read()-1]=MOD-1;getinv(a,t,n);getln(t,a,n);for (int i=0;i<n;i++) a[i]=(ll)a[i]*n%MOD;getexp(a,t,n);int ans=(ll)t[n-1]*inv(n)%MOD;printf("%d\n",ans);return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #723 (Div. 2) D. Kill Anton 线段树 + 暴力

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个只有ANTOANTOANTO四个字母的字符串&#xff0c;你每次可以交换相邻两个&#xff0c;花费为111&#xff0c;让后让你打乱字符串&#xff0c;使得将打乱的字符串还原为原来的字符串的花费最小。 n≤1e…

腾讯开源软件镜像站上线

腾讯开源软件镜像站(Tencent Open Source Mirror Site)已于近日上线&#xff0c;其官方名称为「腾讯云软件源」&#xff0c;由腾讯云提供支持。官方表示搭建此开源镜像站的目的在于宣传自由软件的价值&#xff0c;提高自由软件社区文化氛围&#xff0c;推广自由软件在国内的应用…

【集训队作业2018】复读机【指数型生成函数】【单位根反演】【二项式定理】

传送门 单位根反演听着高级&#xff0c;其实没啥技术含量…… 本文是篇几乎没有证明的佛系讲解 单位根反演的式子长这样&#xff1a; 1n∑i0n−1ωnik[k∣n]\frac{1}{n}\sum_{i0}^{n-1}\omega_n^{ik}[k|n]n1​i0∑n−1​ωnik​[k∣n] 其实本质是IFFT 感觉懵的&#xff1f;…

ASP.NET Core on K8S学习初探(2)

“ [LOG] ASP.NET Core on K8S Starting...”在上一篇《单节点环境搭建》中&#xff0c;通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境&#xff0c;接下来就是动人心弦的部署ASP.NET Core API到K8S了。但是&#xff0c;在部署之前&#xff0c;我还是把基本…

Educational Codeforces Round 96 E. String Reversa 线段树模拟序列交换

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 与上一篇题解大同小异&#xff0c;无非就是不需要枚举排列了。 // Problem: E. String Reversal // Contest: Codeforces - Educational Codeforces Round 96 (Rated for Div. 2) // URL:…

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

传送门 题意&#xff1a;给定nnn和集合SSS,求出nnn个点的「所有极大点双连通分量的大小都在SSS 内」的不同简单无向连通图的个数 模 998244353998244353998244353。 n,∑i∈Si≤105n,\sum_{i\in S}i \leq10^5n,∑i∈S​i≤105 道理我都懂&#xff0c;可为啥我百度搜地灵殿ex终…

ASP.NET Core on K8S学习初探(1)

“ [LOG] ASP.NET Core on K8S Starting...”01—写在之前当近期的一个App上线后&#xff0c;发现目前的docker实例&#xff08;应用服务BFF中台服务工具服务&#xff09;已经越来越多了&#xff0c;而我司目前没有专业的运维人员&#xff0c;发现运维的成本逐渐开始上来&#…

AtCoder Regular Contest 120 C - Swaps 2 线段树模拟

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个序列a,ba,ba,b&#xff0c;每次可以执行一个操作&#xff1a;将a[i]a[i]a[i]与a[i1]a[i1]a[i1]交换&#xff0c;且让交换后的a[i]1,a[i1]−1a[i]1,a[i1]-1a[i]1,a[i1]−1&#xff0c;问将aaa变成bbb…

【BZOJ 4671】异或图 【斯特林反演】【线性基】【贝尔数复杂度】

传送门 题意&#xff1a;定义两个图的异或的边集为在两张图中恰出现一次的边。给sss张nnn个点的图的集合&#xff0c;求异或和为连通图的子集数。 s≤60,n≤10s \leq 60,n \leq 10s≤60,n≤10 设GiG_iGi​表示异或出iii个连通块的子集数&#xff0c;答案就是G1G_1G1​ GGG并不…

.NET Core IdentityServer4实战 第Ⅳ章-集成密码登陆模式

回顾下ClientCredentials模式&#xff0c;在ReSourceApi中定义了我们公开服务&#xff0c;第三方网站想要去访问ReSourceApi则需要在身份验证服务中获取toekn&#xff0c;根据token的内容&#xff0c;硬编码去访问公开服务&#xff08;ResApi&#xff09;,这个还是非常简单的&a…

Codeforces Round #656 (Div. 3) F. Removing Leaves 贪心 + 模拟

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先有一个贪心策略就是每次都找一个叶子节点最多的点&#xff0c;让后删掉他的kkk个叶子节点&#xff0c;现在我们就来考虑如何模拟这个过程。 我们整一个vector<set<int>>ve…

.NetCore中三种注入生命周期的思考

.NetCore彻底诠释了“万物皆可注入”这句话的含义&#xff0c;在.NetCore中到处可见注入的使用。因此core中也提供了三种注入方式的生命周期使用&#xff0c;分别是&#xff1a;AddTransient&#xff1a;每次请求&#xff0c;都获取一个新的实例。即使同一个请求获取多次也会是…

兰州大学第一届 飞马杯 体育课排队 二分 + 最大流 + 输出路径

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 读懂题就会辣&#xff0c;经典模型了&#xff0c;二分时间&#xff0c;让后将其转换成二分图&#xff0c;左边是人&#xff0c;右边是位置&#xff0c;能在规定时间到的连边&#xff0c;跑…

从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图...

如果你使用过一些开源CMS的话&#xff0c;肯定会用过其中的的插件化功能&#xff0c;用户可以通过启用或者上传插件包的方式动态添加一些功能&#xff0c;那么在ASP.NET Core MVC中如何实现插件化开发呢&#xff0c;下面我们来探究一下。本系列只是笔者的一些尝试&#xff0c;并…

感性理解Berlekamp-Massey算法

引入 BM算法主要解决的是根据数列求最短线性齐次递推式的问题在OI中主要辅助打表使用 即&#xff1a;已知FFF&#xff0c;求序列AAA使得 Fn∑i1mAiFn−i(n>m)F_n\sum_{i1}^mA_iF_{n-i} \quad(n>m)Fn​i1∑m​Ai​Fn−i​(n>m) 其中mmm尽量小 算法流程 文中的所有…

兰州大学第一届 飞马杯 ★★飞马祝福语★★ 线段树维护dp(动态dp)

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个串&#xff0c;每次将区间都修改为某一个字母&#xff0c;问最终包含多少个FeiMaFeiMaFeiMa子序列。 思路&#xff1a; 首先暴力修改肯定是不行的&#xff0c;复杂度nqnqnq。 如果没有修改操作&am…

兰州大学第一届 飞马杯 ★★快乐苹果树★★ 树链剖分 + 懒标记 + 树状数组

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 第一次听说树链剖分能在fa[top[i]]fa[top[i]]fa[top[i]]的地方加懒标记&#xff0c;学到了学到了。 首先不能被题目吓住&#xff0c;这个题目仔细剖析一下不难发现一些性质&#xff1a; 以…

【BZOJ3328】PYXFIB【矩阵快速幂】【单位根反演】【二项式定理】

传送门 题意&#xff1a; ∑i0⌊nk⌋(nik)Fik\sum_{i0}^{\lfloor\frac nk\rfloor}\binom n{ik}F_{ik}i0∑⌊kn​⌋​(ikn​)Fik​ FFF为斐波拉契数列 n≤1e18,k≤2e4,p≤1e9n\leq 1e18,k\leq2e4,p\leq1e9n≤1e18,k≤2e4,p≤1e9且为质数且模kkk余111 显然就是求 ∑i0n[k∣i](ni…

.NET分布式框架 | Orleans 知多少

引言公司物联网项目集成Orleans以支持高并发的分布式业务&#xff0c;对于Orleans也是第一次接触&#xff0c;本文就分享下个人对Orleans的理解。这里先抛出自己的观点&#xff1a;Orleans 是一个支持有状态云生应用/服务水平伸缩的基于Virtual Actor 模型的.NET分布式框架。下…

nowcoder 牛牛的最大兴趣组 质因子 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先nnn很小的话可以暴力连边&#xff0c;让后染个色求一个颜色最多的即可。但是这个题显然不行&#xff0c;由于是三次方&#xff0c;所以考虑质因子入手。 首先很容易就能想到将所有的数…