luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开
LINK:多项式 exp
做多项式的题 简直在嗑药。
前置只是 泰勒展开
这个东西用于 对于一个函数f(x) 我们不好得到 其在x处的取值。
所以另外设一个函数g(x) 来在x点处无限逼近f(x).
具体的 \(f(x) ≈ g(x)=g(0)+\frac{f^1(0)}{1!}x+\frac{f^2(0)}{2!}x^2+...+\frac{f^n(0)}{n!}x^n\)
牛顿迭代:
常用来求一个函数的零点:假设我们已经求得一个近似值x0 那么我们只需要过(x0,f(x0))这个点做函数图像的切线 取切线与x轴的交点作为新的x0.
迭代几次就可以比较精确。
如:现在要求一个函数f(x) 近似值为x0 y=f'(x0)(x-x0)+f(x0);
y=0时 \(x=x0-\frac{f(x0)}{f'(x0)}\)
当然也可以放到多项式上 现在要求一个G(x) 我们想要求出F(G(x))=0的零点G(x).
\(G(x)=G0(x)-\frac{F(G0(x))}{F'(G0(x))}\)
本质上每迭代一次都可以迅速逼近真实值。
如果\(F(G0(x))≡0(\bmod x^{2n})\)那么\(F(G(x))\equiv 0(\bmod{x^{n}})\)
关于这道题的推导过程:
\(B(x)\equiv e^{A(x)}(\bmod x^n)\)
\(InB(x)-A(x)\equiv 0(\bmod x^n)\)
现在设一个函数\(F(G(x))=InG(x)-A(x)\equiv 0\)
其实在求F这个函数的零点.
两边直接求导可得 \((F(G0(x)))'=\frac{G'0(x)}{G0(x)}\)
带入牛顿迭代的式子里。
\(G(x)=\frac{G0(x)(1-InG0(x)+A(x))}{G'0(x)}\)
每次迭代需要 求逆 做多项式In 再来一遍多项式乘法即可。
废什么话 码!
求导 和 积分需要仔细熟悉一下.
const int MAXN=600010,G=3;
int n;
int A[MAXN],B[MAXN],E[MAXN],F[MAXN],C[MAXN],D[MAXN],g[MAXN],rev[MAXN],inv[MAXN],O[MAXN];
inline int mul(int a,int b){return (ll)a*b%mod;}
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int mus(int a,int b){return a-b<0?a-b+mod:a-b;}
inline int ksm(int b,int p)
{
int cnt=1;
while(p)
{
if(p&1)cnt=mul(cnt,b);
p=p>>1;b=mul(b,b);
}
return cnt;
}
inline void NTT(int *a,int op,int ww)
{
int lim=1;while(lim<ww)lim=lim<<1;
rep(0,lim-1,i)
{
rev[i]=rev[i>>1]>>1|((i&1)?lim>>1:0);
if(i<rev[i])swap(a[i],a[rev[i]]);
}
for(int len=2;len<=lim;len=len<<1)
{
int mid=len>>1;
int wn=ksm(G,op==1?(mod-1)/len:mod-1-(mod-1)/len);
O[0]=1;rep(1,mid-1,i)O[i]=(ll)O[i-1]*wn%mod;
for(int j=0;j<lim;j+=len)
{
for(int i=0;i<mid;++i)
{
int x=a[i+j],y=(ll)a[i+j+mid]*O[i]%mod;
a[i+j]=(x+y)%mod;a[i+j+mid]=(x-y+mod)%mod;
}
}
}
if(op==-1)for(int i=0,inv=ksm(lim,mod-2);i<lim;++i)a[i]=(ll)a[i]*inv%mod;
}
inline void Direv(int *a,int *b,int len)//求导
{
rep(0,len-2,i)b[i]=mul(a[i+1],i+1);b[len-1]=0;
}
inline void Inv(int *a,int *b,int len)
{
if(len==1)return b[0]=ksm(a[0],mod-2),void();
Inv(a,b,len>>1);rep(0,len-1,i)C[i]=a[i],D[i]=b[i];
NTT(C,1,len<<1);NTT(D,1,len<<1);
rep(0,(len<<1)-1,i)D[i]=mul(D[i],mul(D[i],C[i]));
NTT(D,-1,len<<1);
rep(0,len-1,i)b[i]=((ll)2*b[i]-D[i]+mod)%mod;
rep(0,(len<<1)-1,i)C[i]=D[i]=0;
}
inline void Inter(int *a,int *b,int len)
{
rep(1,len-1,i)b[i]=mul(a[i-1],inv[i]);b[0]=0;
}
inline void Ln(int *a,int *b,int len)
{
Inv(a,E,len);Direv(a,F,len);
NTT(E,1,len<<1);NTT(F,1,len<<1);
rep(0,(len<<1)-1,i)E[i]=mul(E[i],F[i]);
NTT(E,-1,len<<1);Inter(E,b,len);
rep(0,(len<<1)-1,i)E[i]=F[i]=0;
}
inline void Exp(int *a,int *b,int len)
{
if(len==1)return b[0]=1,void();
Exp(a,b,len>>1);Ln(b,g,len);
g[0]=(a[0]+1-g[0]+mod)%mod;
rep(1,len-1,i)g[i]=mus(a[i],g[i]);
NTT(g,1,len<<1);NTT(b,1,len<<1);
rep(0,(len<<1)-1,i)b[i]=mul(b[i],g[i]);
NTT(b,-1,len<<1);rep(len,(len<<1)-1,i)g[i]=b[i]=0;
}
int main()
{
//freopen("1.in","r",stdin);
get(n);rep(0,n-1,i)get(A[i]);
int len=1;while(len<n)len=len<<1;
inv[1]=1;rep(2,(len<<1),i)inv[i]=(ll)inv[mod%i]*(mod-mod/i)%mod;
Exp(A,B,len);rep(0,n-1,i)put_(B[i]);return 0;
}
luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开的更多相关文章
- 洛谷P4726 【模板】多项式指数函数(多项式exp)
题意 题目链接 Sol 多项式exp,直接套泰勒展开的公式 \(F(x) = e^{A(x)}\) 求个导\(F'(x) = A(x)\) 我们要求的就是\(G(f(x)) = lnF(x) - A( ...
- luogu P4726 多项式指数函数(模板题FFT、多项式求逆、多项式对数函数)
手动博客搬家: 本文发表于20181127 08:39:42, 原地址https://blog.csdn.net/suncongbo/article/details/84559818 题目链接: ht ...
- Luogu 4726 【模板】多项式指数函数
补补补…… 这个题的解法让我认识到了泰勒展开的美妙之处. 泰勒展开 泰勒展开就是用一个多项式型的函数去逼近一个难以准确描述的函数. 有公式 $$f(x)\approx g(x) = g(x_0) + ...
- [洛谷P4726]【模板】多项式指数函数
题目大意:给出$n-1$次多项式$A(x)$,求一个 $\bmod{x^n}$下的多项式$B(x)$,满足$B(x) \equiv e^{A(x)}$. 题解:(by Weng_weijie) 泰勒展 ...
- 牛顿迭代,多项式求逆,除法,开方,exp,ln,求幂
牛顿迭代 若 \[G(F_0(x))\equiv 0(mod\ x^{2^t})\] 牛顿迭代 \[F(x)\equiv F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(mod ...
- 【loj6538】烷基计数 加强版 加强版 Burnside引理+多项式牛顿迭代
别问我为啥突然刷了道OI题,也别问我为啥花括号不换行了... 题目描述 求含 $n$ 个碳原子的本质不同的烷基数目模 $998244353$ 的结果.$1\le n\le 10^5$ . 题解 Bur ...
- LOJ #6538. 烷基计数 加强版 加强版(生成函数,burnside引理,多项式牛顿迭代)
传送门. 不妨设\(A(x)\)表示答案. 对于一个点,考虑它的三个子节点,直接卷起来是\(A(x)^3\),但是这样肯定会计重,因为我们要的是无序的子节点. 那么用burnside引理,枚举一个排列 ...
- 【Cogs2187】帕秋莉的超级多项式(多项式运算)
[Cogs2187]帕秋莉的超级多项式(多项式运算) 题面 Cogs 题解 多项式运算模板题 只提供代码了.. #include<iostream> #include<cstdio& ...
- 多项式总结&多项式板子
多项式总结&多项式板子 三角/反三角是不可能放的(也不可能真香的 多项式乘法(DFT,FFT,NTT,MTT) 背板子 前置知识:泰勒展开 如果\(f(x)\)在\(x_0\)处存在\(n\) ...
随机推荐
- Linux系统 Centos7 环境基于Docker部署Rocketmq服务
消息队列 基本概述 MQ,Message Queue,基于TCP协议构建的简单协议,区别于具体的通信协议. 基于通信协议定义和抽象的更高层次的通信模型,一般都是生产者和消费者模型,又或者说服务端和客户 ...
- PowerJob 的故事开始:“玩够了,才有精力写开源啊!”
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列.经过几番的努力和沟通,终于邀请到分布式任务调度与计算 ...
- 【GIT】git详解
目录 一.基础使用 二.分支管理 三.提交树操作 四.复杂工作流处理 ----------------------------------------------------------------- ...
- java 面向对象(三十九):反射(三)了解ClassLoader
1.类的加载过程----了解 2.类的加载器的作用 3.类的加载器的分类 4.Java类编译.运行的执行的流程 5.使用Classloader加载src目录下的配置文件 @Test public vo ...
- 数据可视化之powerBI基础(四)深入了解PowerBI的工具提示功能
https://zhuanlan.zhihu.com/p/36804592 在PowerBI上个月的更新中,增加了工具提示功能,这项功能允许您将自己的可视化作品放置到工具提示中,通过鼠标悬停的方式来展 ...
- javascript基础(三): 操作DOM对象(重点)
DOM:文档对象模型 核心 浏览器网页就是一个Dom树形结构! 更新:更新Dom节点 遍历Dom节点:得到Dom节点 删除:删除一个Dom节点 添加:添加一个新的节点 要操作一个Dom节点,就必须要先 ...
- Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型
Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...
- The solution for apt-get update Err 404
最近在ubuntu 12.10上执行sudo apt-get update 命令后出现了如下错误: Ign http://extras.ubuntu.com natty/main Translatio ...
- vue 集成html5 plus
首先要安装一个包 vue-html5plus npm i vue-html5plus -S 然后配置这个文件 在main.js添加一串代码 var onPlusReady = function (ca ...
- 【软件测试】Python自动化软件测试算是程序员吗?
今天早上一觉醒来,突然萌生一个念头,[软件测试]软件测试算是程序员吗?左思右想,总感觉哪里不对.做了这么久的软件测试,还真没深究过这个问题. 基于,内事问百度的准则: 结果…… 我刚发 ...