P4725 【模板】多项式对数函数(多项式 ln)

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

洛谷P4725 【模板】多项式对数函数(多项式 ln)

题目大意

给你一个 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 ( x ) ≡ ln ⁡ A ( x ) B(x)\equiv \ln A(x) B(x)lnA(x)

  m o d   998244353 \bmod 998244353 mod998244353下进行, a i ∈ [ 0 , 998244353 ) a_i\in[0,998244353) ai[0,998244353)且为整数。

保证 a 0 = 1 a_0=1 a0=1

n ≤ 1 0 5 n\leq 10^5 n105


题解

前置知识:多项式乘法逆

依题意, B ( x ) = ln ⁡ A ( x ) B(x)=\ln A(x) B(x)=lnA(x),两边同时求导得

B ′ ( x ) = A ′ ( x ) A ( x ) B'(x)=\dfrac{A'(x)}{A(x)} B(x)=A(x)A(x)

A ( x ) A(x) A(x)进行多项式乘法逆求出 1 A ( x ) \dfrac{1}{A(x)} A(x)1,然后根据求导法则求出 A ′ ( x ) A'(x) A(x)。然后 B ′ ( x ) = A ′ ( x ) ⋅ 1 A ( x ) B'(x)=A'(x)\cdot \dfrac{1}{A(x)} B(x)=A(x)A(x)1,再积分一下得到 B ( x ) B(x) B(x)

因为常数项 a 0 = 1 a_0=1 a0=1,所以 B ( x ) B(x) B(x)的常数项 b 0 = 0 b_0=0 b0=0

时间复杂度为 O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n)

求导和积分

( x n ) ′ = n x n − 1 (x^n)'=nx^{n-1} (xn)=nxn1

∫ x n d x = 1 n + 1 x n + 1 \int x^ndx=\dfrac{1}{n+1}x^{n+1} xndx=n+11xn+1文章来源地址https://www.toymoban.com/news/detail-435340.html

code

#include<bits/stdc++.h>
using namespace std;
long long w,wn,f[500005],g[500005],a1[500005];
const long long G=3,mod=998244353;
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 solve(int l){
	if(l==1){
		g[0]=mi(f[0],mod-2);
		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;
	ch(a1,len);ch(g,len);
	ntt(a1,len,1);
	ntt(g,len,1);
	for(int i=0;i<len;i++){
		g[i]=(2-a1[i]*g[i]%mod+mod)%mod*g[i]%mod;
	}
	ch(g,len);
	ntt(g,len,-1);
	for(int i=l;i<len;i++) g[i]=0;
}
void qiudao(long long *a,int l){
	for(int i=0;i<l;i++) a[i]=a[i+1]*(i+1)%mod;
	a[l-1]=0;
}
void jifen(long long *a,int l){
	for(int i=l;i>=1;i--) a[i]=a[i-1]*mi(i,mod-2)%mod;
	a[0]=0;
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&f[i]);
	}
	solve(n);
	int len=1;
	while(len<n*2) len<<=1;
	qiudao(f,len);
	ch(f,len);ch(g,len);
	ntt(f,len,1);ntt(g,len,1);
	for(int i=0;i<len;i++) f[i]=f[i]*g[i]%mod;
	ch(f,len);
	ntt(f,len,-1);
	jifen(f,len);
	for(int i=0;i<n;i++){
		printf("%lld ",f[i]);
	}
	return 0;
}

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

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

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

相关文章

  • Python做曲线拟合(一元多项式拟合及任意函数拟合)

    目录 1. 一元多项式拟合 使用方法 np.polyfit(x, y, deg) 2. 任意函数拟合 使用 curve_fit() 方法 实例: (1)初始化 x 和 y 数据集 (2)建立自定义函数 (3)使用自定义的函数生成拟合函数绘图  polyfig 使用的是最小二乘法,用于拟合一元多项式函数。 参数说明: x 就是x坐标,

    2024年02月02日
    浏览(49)
  • 在嵌入式设备中用多项式快速计算三角函数和方根

    惯性传感器的倾角计算要用到三角函数. 在 MCS-51, Cortex M0, M3 之类的芯片上编程时, 能使用的资源是非常有限, 通常只有两位数KB的Flash, 个位数KB的RAM. 如果要使用三角函数和开方就要引入 math.h, 会消耗掉10KB以上的Flash空间. 在很多情况下受硬件资源限制无法使用 math.h, 这时候使

    2024年03月09日
    浏览(79)
  • numpy 多项式函数回归与插值拟合模型;ARIMA时间序列模型拟合

    参考: https://blog.csdn.net/mao_hui_fei/article/details/103821601 1、多项式函数回归拟合 x ^3+ x ^2… 2、多项式函数插值拟合 对于插值函数 interp1d(phone_time, phone_x, kind=‘cubic’),无法直接获取多项式的参数与具体函数表达式。这是因为该函数使用样条插值方法,它的内部实现是基于一组数

    2024年02月16日
    浏览(70)
  • AA@有理系数多项式@整系数多项式@本原多项式@有理多项式可约问题

    有理数域上一元多项式的因式分解. 作为 因式分解定理 的一个特殊情形,我们有结论: 每个次数大等于1的 有理系数多项式 都能 唯一地 分解成 不可约的有理系数多项式 的乘积. 有理数域版本中,从一般数域具体到了\\\" 有理系数 \\\" 我们讨论多项式的时候,都假设多项式是在某个数

    2024年02月16日
    浏览(49)
  • 用链表表示多项式,并实现多项式的加法运算

    输入格式: 输入在第一行给出第一个多项式POLYA的系数和指数,并以0,0 结束第一个多项式的输入;在第二行出第一个多项式POLYB的系数和指数,并以0,0 结束第一个多项式的输入。 输出格式: 对每一组输入,在一行中输出POLYA+POLYB和多项式的系数和指数。 输入样例: 输出样例: 本

    2024年02月07日
    浏览(67)
  • 基于MATLAB的矩阵性质:行列式,秩,迹,范数,特征多项式与矩阵多项式

    本节主要讨论矩阵的基本概念和性质,结合MATLAB的基础代码,适合新手。 矩阵的 行列式 的数学定义如下: MATLAB调用的格式如下: 求以下矩阵的行列式: 解: MATLAB代码如下: 运行结果: ans =    5.1337e-13 利用解析解的方法计算20✖️20的Hilbert矩阵的行列式,并分析其代码运

    2024年02月05日
    浏览(61)
  • 【C 数据结构】 用单链表存储一元多项式,并实现两个多项式相加运算。

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

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

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

    2024年02月11日
    浏览(47)
  • 多项式承诺: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日
    浏览(55)
  • 多项式拟合

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

    2024年02月04日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包