多项式对数函数(多项式 ln)

前置知识

ln 求导

ln(t)

结论

ln(t)=1t

证明

设:

1εln(1+εt)=k

1kεln(1+εt)=1

(1+εt)1kε=e=limx(1+1x)x

那么就得到了:

{εt=1x1kε=x

相乘得到:

1kt=1

那么:

k=1t

ln(t)=1t

至此,证毕。


多项式求导

f(x)

结论

[xt]f(x)xtt[xt]f(x)xt1

写得和蔼一点就是:aixiaiixi1

积分同理,即回带。

证明

稍微咕一下,就一下。


复合函数求导法则

结论

h(x)=f[g(x)],h(x)=f[g(x)]g(x)

证明

稍微咕一下,就

多项式求 ln

ln(f(x))=g(x)

g(x)=ln(f(x))f(x)=1f(x)f(x)


正题

由前面我们已经发现了 ln 函数的优美性质,其导数为 1x

结合复合函数求导公式,我们就可以干一些好玩的事情。

对于:

lnA(x)B(x)(modp)

我们就可以通过复合函数求导得到:

lnA(x)A(x)B(x)

1A(x)A(x)B(x)

对于给定的 A,第一项,我们可以由求逆得到,第二项,由多项式求导得到。

于是我们就可以将两者卷起来求得 B 的导数,然后将其转回去得到系数。

这里有个有趣的小细节,就是实际上,转回去之后,我们会不知道常数项,这应该怎么办呢?实际上常数项就是 0,至于为什么,之后在 exp 部分会详细证明。


代码

#include <stdio.h> #define LL long long using namespace std; const int N=3e5+3; const int M=998244353; const int K=3; inline int rin() { int s=0; bool bj=false; char c=getchar(); for(;(c>'9'||c<'0')&&c!='-';c=getchar()); if(c=='-')bj=true,c=getchar(); for(;c>='0'&&c<='9';c=getchar())s=(s<<1)+(s<<3)+(c^'0'); if(bj)s=-s; return s; } inline int prpr(int x,int y){return 1LL*x*y%M;} inline int ksm(int x,int y){int ans=1;for(;y;y>>=1){if(y&1)ans=prpr(ans,x);x=prpr(x,x);}return ans;} inline void jh(int &x,int &y){if(x!=y)x^=y^=x^=y;return;} const int Kr=ksm(K,M-2); int num[N]; int lens; inline void init(int L) { int lg=0; for(lens=1;lens<L;lens<<=1)lg++; for(int i=0;i<lens;i++)num[i]=((num[i>>1]>>1)|((i&1)<<lg-1)); return; } inline void NTT(int *a,int tag) { for(int i=0;i<lens;i++)if(i>num[i])jh(a[i],a[num[i]]); for(int i=1;i<lens;i<<=1) { int Gyq=ksm(tag?K:Kr,(M-1)/(i<<1)); for(int j=0;j<lens;j+=(i<<1)) { int Zjj=1; for(int k=0;k<i;k++,Zjj=prpr(Zjj,Gyq)) { int x=a[j+k],y=prpr(a[j+k+i],Zjj); a[j+k]=(x+y)%M; a[j+k+i]=(x-y+M)%M; } } } if(!tag) { int Gyq=ksm(lens,M-2); for(int i=0;i<lens;i++)a[i]=prpr(a[i],Gyq); } return; } int Alpha[N]; inline void inv(int *a,int *b,int L) { if(L==1){b[0]=ksm(a[0],M-2);return;} inv(a,b,(L+1)>>1); init((L<<1)-1); for(int i=0;i<L;i++)Alpha[i]=a[i]; for(int i=L;i<lens;i++)Alpha[i]=0; NTT(Alpha,1); NTT(b,1); for(int i=0;i<lens;i++)b[i]=prpr(b[i],2-prpr(Alpha[i],b[i])); NTT(b,0); for(int i=L;i<lens;i++)b[i]=0; return; } inline void der(int *a,int L){for(int i=1;i<L;i++)a[i-1]=prpr(a[i],i);for(int i=L;i<lens;i++)a[i]=0;return;} int n; int a[N]; int b[N]; int sl[N]; int sr[N]; int main() { n=rin()-1; for(int i=0;i<=n;i++)a[i]=rin(); inv(a,b,n+1); init(n+n+1); der(a,n+1); NTT(a,1); NTT(b,1); for(int i=0;i<lens;i++)b[i]=prpr(b[i],a[i]); NTT(b,0); sl[0]=sr[0]=1; for(int i=1;i<=n;i++)sl[i]=prpr(sl[i-1],i); sr[n]=ksm(sl[n],M-2); for(int i=n-1;i>=1;i--)sr[i]=prpr(sr[i+1],i+1); for(int i=n;i>=1;i--)b[i]=prpr(prpr(b[i-1],sr[i]),sl[i-1]); b[0]=0; for(int i=0;i<=n;i++)printf("%d ",(b[i]%M+M)%M);printf("\n"); return 0; }

__EOF__

本文作者zjjws
本文链接https://www.cnblogs.com/zjjws/p/14203861.html
关于博主:我就是:究极的 Mad Scientist,凤—凰—院—凶—真da!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:这么屑的博主有什么声援的必要吗?
posted @   zjjws  阅读(1217)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示