P5205 【模板】多项式开根

这篇具有很好参考价值的文章主要介绍了P5205 【模板】多项式开根。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

P5205 【模板】多项式开根

题目大意

给你一个 n − 1 n-1 n1的多项式 A ( x ) A(x) A(x),求一个在   m o d   x n \bmod x^n modxn意义下的多项式 B ( x ) B(x) B(x),使得 B 2 ( x ) ≡ A ( x ) ( m o d x n ) B^2(x)\equiv A(x)\pmod{x^n} B2(x)A(x)(modxn)。若有多解,请取零次项系数较小的作为答案。

多项式系数在模 998244353 998244353 998244353的意义下进行计算。


题解

前置知识:

  • 快速数论变换( N T T NTT NTT
  • 多项式乘法逆

设已经求出了 H ( x ) H(x) H(x),使其满足

H 2 ( x ) ≡ A ( x ) ( m o d x ⌈ n 2 ⌉ ) H^2(x)\equiv A(x)\pmod{x^{\lceil\frac n2\rceil}} H2(x)A(x)(modx2n)

那么有

B ( x ) − H ( x ) ≡ 0 ( m o d x ⌈ n 2 ⌉ ) B(x)-H(x)\equiv 0\pmod{x^{\lceil\frac n2\rceil}} B(x)H(x)0(modx2n)

平方得

B 2 ( x ) − 2 B ( x ) ⋅ H ( x ) + H 2 ( x ) ≡ 0 ( m o d x n ) B^2(x)-2B(x)\cdot H(x)+H^2(x)\equiv 0\pmod{x^n} B2(x)2B(x)H(x)+H2(x)0(modxn)

A ( x ) A(x) A(x)替换 B 2 ( x ) B^2(x) B2(x)

B ( x ) = A ( x ) + H 2 ( x ) 2 H ( x ) B(x)=\dfrac{A(x)+H^2(x)}{2H(x)} B(x)=2H(x)A(x)+H2(x)

用多项式求逆和 N T T NTT NTT即可。

注意求 B ( x ) B(x) B(x)时可以先求 v = A ( x ) H ( x ) v=\dfrac{A(x)}{H(x)} v=H(x)A(x),然后 B ( x ) = v + H ( x ) 2 B(x)=\dfrac{v+H(x)}{2} B(x)=2v+H(x)

时间复杂度为 O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n)文章来源地址https://www.toymoban.com/news/detail-437122.html

code

#include<bits/stdc++.h>
using namespace std;
long long w,wn,f[500005],g[500005],a1[500005],a2[500005],a3[500005],v[500005];
const long long G=3,mod=998244353,ny2=499122177;
long long mi(long long t,long long v){
	if(!v) return 1;
	long long re=mi(t,v/2);
	re=re*re%mod;
	if(v&1) re=re*t%mod;
	return re;
}
void ch(long long *a,int l){
	for(int i=1,j=l/2;i<l-1;i++){
		if(i<j) swap(a[i],a[j]);
		int k=l/2;
		while(j>=k){
			j-=k;k>>=1;
		}
		j+=k;
	}
}
void ntt(long long *a,int l,int fl){
	for(int i=2;i<=l;i<<=1){
		if(fl==1) wn=mi(G,(mod-1)/i);
		else wn=mi(G,mod-1-(mod-1)/i);
		for(int j=0;j<l;j+=i){
			w=1;
			for(int k=j;k<j+i/2;k++,w=w*wn%mod){
				long long t=a[k],u=w*a[k+i/2]%mod;
				a[k]=(t+u)%mod;
				a[k+i/2]=(t-u+mod)%mod;
			}
		}
	}
	if(fl==-1){
		long long ny=mi(l,mod-2);
		for(int i=0;i<l;i++) a[i]=a[i]*ny%mod;
	}
}
void gt(int l){
	if(l==1){
		a2[0]=mi(g[0],mod-2);
		return;
	}
	gt((l+1)/2);
	int len=1;
	while(len<2*l) len<<=1;
	for(int i=0;i<l;i++) v[i]=g[i];
	for(int i=l;i<len;i++) v[i]=0;
	ch(v,len);ch(a2,len);
	ntt(v,len,1);ntt(a2,len,1);
	for(int i=0;i<len;i++){
		a2[i]=(2-v[i]*a2[i]%mod+mod)%mod*a2[i]%mod;
	}
	ch(a2,len);
	ntt(a2,len,-1);
	for(int i=l;i<len;i++) a2[i]=0;
}
void pdg(int l){
	for(int i=0;i<l;i++) a3[i]=g[i];
	ch(a3,l);
	ntt(a3,l,1);
	for(int i=0;i<l;i++) a3[i]=a3[i]*a3[i]%mod;
	ch(a3,l);
	ntt(a3,l,-1);
}
void solve(int l){
	if(l==1){
		g[0]=1;
		return;
	}
	solve((l+1)/2);
	int len=1;
	while(len<2*l) len<<=1;
	for(int i=0;i<l;i++) a1[i]=f[i];
	for(int i=l;i<len;i++) a1[i]=0;
	gt(len/2);
	ch(a1,len);ch(a2,len);
	ntt(a1,len,1);ntt(a2,len,1);
	for(int i=0;i<len;i++) a1[i]=a1[i]*a2[i]%mod;
	ch(a1,len);
	ntt(a1,len,-1);
	for(int i=0;i<len;i++){
		g[i]=(a1[i]+g[i])%mod*ny2%mod;
		a1[i]=a2[i]=0;
	}
	for(int i=l;i<len;i++) g[i]=0;
	pdg(len);
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%lld",&f[i]);
	}
	solve(n);
	for(int i=0;i<n;i++){
		printf("%lld ",g[i]);
	}
	return 0;
}

到了这里,关于P5205 【模板】多项式开根的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【C 数据结构】 用单链表存储一元多项式,并实现两个多项式相加运算。

    【C 数据结构】 用单链表存储一元多项式,并实现两个多项式相加运算。

    本次代码纯c语言,可以支持输入两个多项式的项式、系数、指数。 实验目的: 1 掌握单链表的基本工作原理; 2 实现链式存储下的两个多项式的相加。 实验步骤 1 定义链式存储的数据结构 2 完成多项式的初始化,即给多项式赋初值 3 完成多项式的输出 4 实现多项式的相加及结

    2024年02月06日
    浏览(10)
  • 牛顿插值法、拉格朗日插值法、三次插值、牛顿插值多项式、拉格朗日插值多项式

    牛顿插值法、拉格朗日插值法、三次插值、牛顿插值多项式、拉格朗日插值多项式

    两点式线性插值 调用Matlab库函数 拉格朗日二次插值: 牛顿二次插值 结果分析:通过对比不同插值方法,可以看到在一定范围内(高次会出现龙格现象),插值次数越高,截断误差越小(插值结果越接近于真实函数值);同时,对于相同次数的插值,由于不同的插值方法它们

    2024年02月11日
    浏览(10)
  • 多项式乘法逆

    前置知识:NTT学习笔记(快速数论变换) 情景代入 洛谷P4238 【模板】多项式乘法逆 给定一个多项式 f ( x ) f(x) f ( x ) ,求 g ( x ) g(x) g ( x ) ,满足 f ( x ) × g ( x ) ≡ 1 ( m o d x n ) f(x)times g(x)equiv 1pmod{x^n} f ( x ) × g ( x ) ≡ 1 ( mod x n ) 。系数对 998244353 998244353 998244353 取模。 1 ≤

    2024年02月02日
    浏览(7)
  • 多项式拟合

    多项式拟合

    文章内容部分参考: 建模算法入门笔记-多项式拟合(附源码) - 哔哩哔哩 (bilibili.com) (9条消息) 数学建模——人口预测模型 公有木兮木恋白的博客-CSDN博客 数学建模人口预测模型 多项式拟合是数据拟合的一种,与插值有一定区别(插值要求曲线经过给定的点,拟合不一定经

    2024年02月04日
    浏览(12)
  • Jacobi正交多项式

    注:本文的内容主要根据文末中的参考文档[1,2,3]中的内容进行整理完成。 设 I = [ − 1 , 1 ] I=[-1,1] I = [ − 1 , 1 ] 是实轴上的标准区间,定义在 I I I 上的正函数: ω α , β ( x ) = ( 1 − x ) α ( 1 + x ) β , α − 1 , β − 1 omega_{alpha,beta}(x)=(1-x)^{alpha}(1+x)^{beta}, alpha-1,beta-1 ω α , β

    2024年02月13日
    浏览(11)
  • Matlab 多项式拟合

    Matlab 多项式拟合

    corrcoef函数 corrcoef函数用来计算矩阵相关系数。 (1)、corrcoef(x):若x为一个矩阵,返回的则是一个相关系数矩阵。 (2)、corrcoef(x,y):计算列向量x、y的相关系数,要求x、y具有相等的元素个数。如果x、y是矩阵,那么corrcoef函数会将其转换为列向量,相当于corrcoef([x(:),y(:)])。   p

    2024年02月11日
    浏览(14)
  • 多项式承诺:KZG

    多项式承诺:KZG

    参考文献: Merkle, R. ”Protocols for Public Key Cryptosystems.” Proc. 1980 Symp. on Security and Privacy, IEEE Computer Society (April 1980), 122-133. Benaloh J, Mare M. One-way accumulators: A decentralized alternative to digital signatures[C]//Workshop on the Theory and Application of of Cryptographic Techniques. Springer, Berlin, Heidelberg, 1993

    2024年02月04日
    浏览(23)
  • 多项式混沌展开法

    多项式混沌展开法

    多项式混沌采用多项式基组合成随机空间,来描述和传播随机变量的不确定性。本质是利用正交多项式的优异性能,通过随机变量的输入到响应的映射过程建立代理模型。该方法收敛性好,使用方便,能较好的适用于复杂的系统。但是该方法理论难度高,多元情况下正交多项

    2023年04月15日
    浏览(5)
  • Matlab作图多项式拟合

    Matlab作图多项式拟合

    一、拟合函数 polyfit(s,y,n) polyval(p,x) poly2str(p,\\\' x \\\' ) 二、拟合步骤 1.做原始数据的散点图 2.选择恰当的次数n,用polyfit指令求得多项式 3.计算多项式p在x处的值 4.画出多项式函数的曲线图 三、拟合实例 对x等于1-10,y大于20小于40的随机数进行多项式拟合 x=1:10;y=20+20*rand(1,10);%定义

    2023年04月25日
    浏览(4)
  • 多项式快速幂(加强版)

    建议阅读我的上一篇博客多项式快速幂 求多项式快速幂,但 a 0 ≠ 1 a_0not=1 a 0 ​  = 1 。 由于求 ln ⁡ ln ln 要求 a 0 = 1 a_0=1 a 0 ​ = 1 ,所以我们要想办法对多项式进行变换,使其满足 a 0 = 1 a_0=1 a 0 ​ = 1 。 如果 f ( x ) f(x) f ( x ) 常数项为 0 0 0 ,那么就整体除去 x x x 的若干次

    2024年02月07日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包