首页 > 其他分享 >题解 P5809【【模板】多项式复合逆】

题解 P5809【【模板】多项式复合逆】

时间:2024-03-21 11:22:05浏览次数:33  
标签:dfrac PolyY P5809 frac 多项式 题解 kx 模板 size

\(\text{Link}\)

力求把最新技术翻译地人人都能看懂。

推荐先学习:拉格朗日反演

题意

给出 \(n\) 次多项式 \(F(x)\),求一个 \(n\) 次多项式 \(G(x)\) 满足 \(F(G(x))\equiv x(\bmod x^{n+1})\)。保证 \([x^0]F(x)=0\) 且 \([x^1]F(x)\ne 0\)。

\(n\le 2\times 10^4\)。

思路

我们将 \([x^1]F(x)\) 化成 \(1\) 以便后续处理。令 \(F'(x)\) 为原多项式,\(v\) 为 \([x^1]F'(x)\),\(F(x)\) 为 \(\dfrac{F'(x)}{v}\)。

那么我们有:\(F(G(x))=\dfrac{x}{v}\),\(F^k(G(x))=\dfrac{x^k}{v^k}\),根据扩展拉格朗日反演,我们有:

\[[x^n]F^k(x)=\frac1{n}\cdot[x^{n-1}]\frac{kx^{k-1}}{v^k}\cdot\frac{x^n}{G^n(x)} \]

\[[x^n]F^k(x)=\frac k {nv^k}\cdot[x^{n-k}]\frac{x^n}{G^n(x)} \]

\[\sum_kx^{n-k}\frac{nv^k}k[x^n]F^k(x)=\left(\frac{G(x)}x\right)^{-n} \]

\[G(x)=x\left(\sum_kx^{n-k}\frac{nv^k}{k}[x^n]F^k(x)\right)^{-1/n} \]

\[G(x)=\frac{x}v\left(\sum_kx^{n-k}\frac{n}{kv^{n-k}}[x^n]F^k(x)\right)^{-1/n} \]

可以发现此处需要开根的多项式常数项为 \(1\),直接用多项式快速幂即可。于是接下来我们的任务就是对 \(\forall k\in[0,n]\) 求出 \([x^n]F^k(x)\)。不难发现,这等价于求多项式 \([x^n]\dfrac{1}{1-yF(x)}\)。

首先我们需要了解 Bostan-Mori 算法,该算法可在 \(O(k\log k\log n)\) 的复杂度下对 \(O(k)\) 次的多项式 \(F(x),G(x)\) 求出 \([x^n]\dfrac{F(x)}{G(x)}\)。具体地,

\[[x^n]\dfrac{F(x)}{G(x)}=[x^n]\dfrac{F(x)G(-x)}{G(x)G(-x)}=[x^n]\dfrac{F_0(x^2)}{G_0(x^2)}+x\dfrac{F_1(x^2)}{G_0(x^2)} \]

两边分别只有偶数次和奇数次有值,根据 \(n\) 的奇偶性取一边递归即可。当 \(n=0\) 时直接返回 \(\dfrac{[x^0]F(x)}{[x^0]G(x)}\) 即可。

二元多项式的情况也是一样的:

\[[x^n]\dfrac{F(x,y)}{G(x,y)}=[x^n]\dfrac{F(x,y)G(-x,y)}{G(x,y)G(-x,y)}=[x^n]\dfrac{F_0(x^2,y)}{G_0(x^2,y)}+x\dfrac{F_1(x^2,y)}{G_0(x^2,y)} \]

注意到递归到第 \(t\) 层时 \(x\) 只需要保留 \(\lfloor\dfrac{n}{2^t}\rfloor\) 次,而 \(y\) 每层次数只会翻倍,只有 \(2^{t+1}\) 次,所以整个二元多项式只有 \(O(n)\) 项。

于是我们在 \(O(n\log^2n)\) 的时间复杂度内解决了多项式复合逆问题。

核心代码:

namespace PolyC{
	//...
	#define PolyY vector<Poly>
	inline PolyY operator*(const PolyY &a,const PolyY &b){
		int n=a.size(),m=b.size(),p=a[0].size(),q=b[0].size();
		Poly P,Q;
		P.resize(n*(p+q-1)),Q.resize(m*(p+q-1));
		for(int i=0;i<n;i++)
			for(int j=0;j<p;j++)
				P[i*(p+q-1)+j]=a[i][j];
		for(int i=0;i<m;i++)
			for(int j=0;j<q;j++)
				Q[i*(p+q-1)+j]=b[i][j];
		P=P*Q;
		PolyY F(n+m-1,Poly(p+q-1,0)); 
		for(int i=0;i<n+m-1;i++)
			for(int j=0;j<p+q-1;j++)
				F[i][j]=P[i*(p+q-1)+j]; 
		return F;
	}
}
using namespace PolyC;
inline Poly BostanMori(int n,PolyY F,PolyY G){
	if(!n) return F[0]*Inv(G[0]);
	if(n+1<F.size()) F.resize(n+1);
	if(n+1<G.size()) G.resize(n+1);
	PolyY H=G;
	for(int i=1;i<H.size();i+=2)
		for(int j=0;j<H[i].size();j++)
			H[i][j]=dec(0,H[i][j]);
	F=F*H,G=G*H;
	PolyY A,B;
	for(int i=n&1;i<F.size();i+=2) A.push_back(F[i]);
	for(int i=0;i<G.size();i+=2) B.push_back(G[i]);
	return BostanMori(n/2,A,B);
}
inline Poly CompInv(Poly F){
	int n=F.size();
	int t=F[1],v=qpow(t,mod-2);
	for(int i=0;i<n;i++)
		F[i]=1ll*F[i]*v%mod;
	PolyY P,Q;
	for(int i=0;i<n;i++)
		P.push_back({!i,0}),
		Q.push_back({!i,dec(0,F[i])});
	Poly G=BostanMori(n-1,P,Q),H(n,0); 
	G.resize(n);
	for(int i=0;i<n;i++)
		H[n-1-i]=1ll*G[i]*(n-1)%mod*inv[i]%mod;
	for(int i=0,w=1;i<n;i++,w=1ll*w*v%mod)
		H[i]=1ll*H[i]*w%mod;
	H=Pow(H,mod-inv[n-1]);
	H.insert(H.begin(),0),H.resize(n);
	for(int i=0;i<n;i++)
		H[i]=1ll*H[i]*v%mod;
	return H;
}

标签:dfrac,PolyY,P5809,frac,多项式,题解,kx,模板,size
From: https://www.cnblogs.com/cyffff/p/18086971

相关文章

  • uniapp 开发模板
    简介vue3-uniapp-template是基于vue3的uniapp快速开发模板,包含状态管理、网络请求、路由拦截、UI组件等常用功能。主要使用的技术栈:uniapp、vue3、pinia、vite、uv-ui下载地址PS:如果对你有帮助的话,点个Star支持下哈~GithubGitee项目启动#克隆代码gitclonehttps://gi......
  • C++模板实现之谜:为何只能在头文件中?解密原因与高级分离技术
     概述:C++中模板必须在头文件中实现,因为编译器需要可见的实现以生成模板具体实例的代码。通过头文件,确保模板在每个编译单元中都能被正确展开,提高可维护性。在C++中,模板只能在头文件中实现的主要原因是编译器在使用模板时需要生成对应的代码,而这部分代码必须在编译时可见。以......
  • C++ 函数模板
    C++函数模板函数模板在C++中,函数模板是一种允许函数以一种类型无关的方式来操作的工具。它们使得函数能够处理不同类型的数据而不需要为每种类型编写重复的代码。函数模板的核心思想是“参数化类型”,这意味着在定义函数时,可以使用一个或多个通用类型参数,而在函数被调用时......
  • 20240320每日一题题解
    20240320每日一题题解Problem阿克曼(Ackermann)函数\(A(m,n)\)中,\(m,n\)定义域是非负整数(\(m\le3\),\(n\le10\)),函数值定义为:\(\mathit{akm}(m,n)=n+1\);(\(m=0\)时)。\(\mathit{akm}(m,n)=\mathit{akm}(m-1,1)\);(\(m>0\)、\(n=0\)时)。\(\mathit{akm}(m,n)=......
  • CF817F MEX Queries 题解
    题目链接:CF或者洛谷不是很难的题,但在这里提供一个动态开点线段树怎么卡空间卡过去的极致空间处理技巧全局\(mex\)问题,常见的做法就是维护权值树,然后找第一个没有权值的点,可以维护\(\min\),但本题存在第三个操作,所以不能再去传统地维护\(\min或者\max\)去辅助二分了。观......
  • [ARC174B] Bought Review 题解
    【题目描述】你开了一家店,有\(A_i\)个\(i\)星级评论,你可以花费\(P_i\)元买到一个\(i\)星评论,问使得这家店评论的星星平均值不小于\(3\),最少要花多少钱。\(1\lei\le5\)。【思路】首先读入,判断平均值是否小于\(3\),如果大于等于,直接输出\(0\)​然后根据\(3\t......
  • C++ 模板入门详解
    目录0.模板引入1.函数模板 1.函数重载的缺点 2.函数模板的概念和格式2. 函数模板的实例化 2.1 隐式实例化:让编译器根据实参推演模板参数的实际类型 2.2 显式实例化:在函数名后的<>中指定模板参数的实际类型2.3函数模板参数的匹配规则 3.类模板 3.1类......
  • P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包
    原题链接题解这么优质的文章我写什么题解好难解释必然性感觉像模拟??code#include<bits/stdc++.h>usingnamespacestd;intq[100005]={0};structnode{doublex,y;}a[100005];doubledis(intb,intc){nodei=a[b],j=a[c];returnsqrt((i.x-j.x)*(i.x-......
  • luogu6801题解
    本题解中不区别长度和宽度的区别,它们在本题解中指的是同一个东西。本题解做法用到单调栈。看这个特殊性质好像是让我们在高度上进行研究一下。子任务\(4\)的特殊性质是想让你搞明白在一个矩形中如何计算其内部的矩形个数。下面是一个\(4\times5\)大小的矩形。先来不考......
  • C++初阶:初识模板
        在之前的C与C++编程中,针对实现同样类型功能的函数我们学会使用了函数重载,终于可以不用记忆多个功能相同但是函数名不同的函数了喵。但是在实现的时候仍然显得有点不太方便,有些冗余。世界是懒人的世界,为了方便懒人的使用,模板应运而生~目录一、引子二、函数模......