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);
}