Luogu P4725 多项式 ln

\(\mathtt{Description}\)

\(\deg = n\) 的多项式 \(f\),求一多项式 \(g\),使 \(g= \ln f\)

\(998244353\) 取模。

\(\mathtt{restrictions:}1\le n \le 10^5\)

\(\mathtt{Solution}\)

\(\ln\) 显然是不好求的,我们思考如何转化。

考虑求导:\(\ln (x)'=\dfrac 1 x\)

\[\because g = \ln f(x) \]

由复合函数的求导法则:

\[g(f(x))'=g'(f(x))f'(x) \]

可得

\[g' = \frac {f'(x)} {f(x)} \]

求出 \(f\) 的导数和逆元,相乘可得 \(g'\),对 \(g'\) 积分可得 \(g\)

求导和积分公式:

\[f(x)=x^n,f'(x)=nx^{n-1},\int x^n \text{dx}=\dfrac{1}{n+1}x^{n+1} \]

\(\mathtt{Code}\)

//函数参数含义:
//dev(f,g,len) 求 f 的导数,结果为 g
//itg(f,g,len) 求 f 的积分,结果为 g
//Getln(f,g,len) 求 f 的 ln,结果为 g
//Getinv(f,g,len) 求 f 的逆元,结果为 g
//mul(f,g,r,len) 求 f 和 g 的卷积,结果为 r
//上述 len 表示在模 x^len 意义下进行
	inline void dev(const int f[],int g[],const int len) {
		for (int i = 1; i < len; ++i) g[i-1] = 1ll * f[i] * i % mod ;
		g[len-1] = 0  ;
	}

	inline void itg(const int f[],int g[],const int len) {
		for (int i = 1; i < len; ++i) g[i] = 1ll * f[i-1] * inv[i] % mod ;
		g[0] = 0 ; 
	}

	inline void Getln(const int f[],int g[],const int len) {
		static int A[N],B[N] ;
		dev(f,A,len),Getinv(f,B,len),mul(A,B,A,len<<1),itg(A,g,len),memset(A,0,len<<2),memset(B,0,len<<2);
	}

posted @ 2021-07-21 11:07  feicheng  阅读(39)  评论(0编辑  收藏  举报