主要作为一个模板和总结

多项式ln

  • 求G(x)=ln(F(x))G(x)=ln(F(x))G(x)=ln(F(x))
  • 两边求导
  • G′(x)=F′(x)F(x)G'(x)=\frac{F'(x)}{F(x)}G′(x)=F(x)F′(x)​,注意这是复合函数求导。
  • 多项式求逆,求导,乘法即可求出G′(x)G'(x)G′(x)
  • 再积分回去就是G(x)G(x)G(x)
  • 一般会钦定常数项为1,否则ln的时候先求导再积分(这里是不定积分)你会发现常数项丢失了,得到的结果并不是原来的多项式,而是在每一项的基础上除以了常数项。

多项式exp

牛顿迭代

  • 用于求函数的零点,在某些情况下可以应用,但是在一些奇怪的情况下永远逼近不了解。
  • 做法:随便选择一个起点x0x_0x0​,作f(x)f(x)f(x)在x0x_0x0​上的切线,交xxx轴与x1x_1x1​,x1x_1x1​相比x0x_0x0​比零点更近,不断迭代即可求得一个逼近零点的点。
  • 作切线根据导数的知识可以知道:
    f′(x0)(x0−x1)=f(x0)f'(x_0)(x_0-x_1)=f(x_0)f′(x0​)(x0​−x1​)=f(x0​)
    x1=x0−f(x0)f′(x0)x_1=x_0-\frac{f(x_0)}{f'(x_0)}x1​=x0​−f′(x0​)f(x0​)​

从实数到多项式的伟大扩展

  • 相当于求G(F(x))=0(modxn)G(F(x))=0\ (mod\ x^n)G(F(x))=0 (mod xn)
  • 考虑倍增(实际上就是一个精度不断提升的过程)。
    G(F0(x))=0(modxn/2)G(F_0(x))=0\ (mod\ x^{n/2})G(F0​(x))=0 (mod xn/2)
  • 根据泰勒展开,在F0(x)F_0(x)F0​(x)求得:
    G(F(x))=G(F0(x))+G′(F0(x))1!(F(x)−F0(x))+G′′(F0(x))1!(F(x)−F0(x))2+...G(F(x))=G(F_0(x))+\frac{G'(F_0(x))}{1!}(F(x)-F_0(x))+\frac{G''(F_0(x))}{1!}(F(x)-F_0(x))^2+...G(F(x))=G(F0​(x))+1!G′(F0​(x))​(F(x)−F0​(x))+1!G′′(F0​(x))​(F(x)−F0​(x))2+...
  • 因为F(x)F(x)F(x)和F(x0)F(x_0)F(x0​)是在modxn/2mod\ x^{n/2}mod xn/2下的,所以平方之后在modxnmod\ x^nmod xn下就为0了,所以只有前两项有意义。
  • 实际这就是泰勒展开的式子,每一次的精度翻倍。
    G(F(x))=G(F0(x))+G′(F0(x))(F(x)−F0(x))G(F(x))=G(F_0(x))+G'(F_0(x))(F(x)-F_0(x))G(F(x))=G(F0​(x))+G′(F0​(x))(F(x)−F0​(x))

利用牛顿迭代

  • 要求B(x)=eA(x)B(x)=e^{A(x)}B(x)=eA(x)
  • lnB(x)=A(x)ln\ B(x)=A(x)ln B(x)=A(x)
  • F(B(x))=lnB(x)−A(x)=0F(B(x))=ln\ B(x)-A(x)=0F(B(x))=ln B(x)−A(x)=0
  • 求零点B(x)B(x)B(x),A(x)A(x)A(x)视作常数。
  • 所以F′(B(x))=1B(x)F'(B(x))=\frac{1}{B(x)}F′(B(x))=B(x)1​
  • 假设已经求出了B0(x)B_0(x)B0​(x)为xn/2x^{n/2}xn/2下的零点,则:
  • B(x)=B0(x)−F(B0(x))F′(B0(x))B(x)=B_0(x)-\frac{F(B_0(x))}{F'(B_0(x))}B(x)=B0​(x)−F′(B0​(x))F(B0​(x))​
  • B(x)=B0(x)(1−lnB0(x)+A(x))(modxn)B(x)=B_0(x)(1-ln\ B_0(x)+A(x))(mod\ x^n)B(x)=B0​(x)(1−ln B0​(x)+A(x))(mod xn)
  • 倍增,利用多项式ln和多项式乘法即可。

关于值域的选择

  • 求limlimlim下ln的时候是2个limlimlim下的多项式的乘法,记得开两倍长度去乘。
  • 求exp时也要注意是当前长度的两倍。实际上迭代次数越多就越准确,没有规定的次数(建议多倍增一次),在一定次数之后再进行迭代在有限位置的系数就不会改变了,乘上的ln的值域也没有限定的要求,但是总的长度一定要开到有值的位置最大长度的和。
  • 无关的位置要清空。

多项式快速幂

  • ln再乘指数再exp回去。注意ln之后常数项的贡献被除掉了,这个部分要单独再快速幂。

JZOJ6712

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 524288
#define ll long long
#define mo 998244353
using namespace std;ll n,m,T,S,a[maxn],b[maxn],c[maxn];
ll w[maxn+5],inv[maxn+5];
int bt[maxn];ll ksm(ll x,ll y){ll s=1;for(;y;y/=2,x=x*x%mo) if (y&1)s=s*x%mo;return s;
}void clear(ll *a,int n){memset(a,0,sizeof(ll)*n);}void prepare(){inv[0]=inv[1]=1;for(int i=2;i<=maxn;i++) inv[i]=(mo-mo/i)*inv[mo%i]%mo;w[0]=1,w[1]=ksm(3,(mo-1)/maxn);for(int i=2;i<=maxn;i++) w[i]=w[i-1]*w[1]%mo;
}void getbt(int n){for(int i=1;i<n;i++)bt[i]=(bt[i>>1]>>1)|((i&1)?n>>1:0);}
int getlim(int n){int lim=1;while (lim<=n) lim<<=1;return lim;}void dft(ll *a,int sig,int lim){for(int i=0;i<lim;i++) if (i<bt[i]) swap(a[i],a[bt[i]]);for(int mid=1;mid<lim;mid<<=1){int d=sig*maxn/(mid<<1),s=(sig<0)?maxn:0;for(int j=0;j<lim;j+=mid<<1){for(int k=0,p=s;k<mid;k++,p+=d){ll x=a[j+k],y=a[j+k+mid]*w[p];a[j+k]=(x+y)%mo,a[j+k+mid]=(x-y)%mo;}}}
}void getinv(ll *a,ll *b,int lim){static ll A[maxn],B[maxn],C[maxn];clear(b,lim);b[0]=ksm(a[0],mo-2);for(int len=2;len<=lim;len<<=1){int L=len<<1;getbt(L);clear(A,L),clear(B,L);for(int i=0;i<len;i++) A[i]=a[i];for(int i=0;i<len;i++) B[i]=b[i];dft(A,1,L),dft(B,1,L);for(int i=0;i<L;i++) C[i]=A[i]*B[i]%mo*B[i]%mo;dft(C,-1,L);for(int i=0;i<L;i++) C[i]=C[i]*inv[L]%mo;for(int i=0;i<len;i++) b[i]=(b[i]*2-C[i])%mo;}
}void multi(ll *a,ll *b,ll *c,int lim){getbt(lim);dft(a,1,lim),dft(b,1,lim);for(int i=0;i<lim;i++) c[i]=a[i]*b[i]%mo;dft(c,-1,lim);for(int i=0;i<lim;i++) c[i]=c[i]*inv[lim]%mo;
}void getln(ll *a,ll *b,int lim){static ll A[maxn],B[maxn];clear(A,lim<<1),clear(B,lim<<1);for(int i=0;i<lim-1;i++) A[i]=a[i+1]*(i+1)%mo;getinv(a,B,lim);for(int i=lim;i<lim<<1;i++) A[i]=B[i]=0;multi(A,B,b,lim<<1);for(int i=lim-1;i>=0;i--) b[i+1]=b[i]*inv[i+1]%mo;b[0]=0;for(int i=lim;i<lim<<1;i++) b[i]=0;
}void getexp(ll *a,ll *b,int lim){static ll G[maxn],F[maxn],H[maxn];clear(G,lim<<1),clear(F,lim<<1),clear(H,lim<<1);G[0]=1;for(int len=2;len<=lim<<1;len<<=1){getln(G,F,len);for(int i=0;i<len;i++) F[i]=((i==0)-F[i]+a[i])%mo;multi(G,F,H,len<<1);for(int i=0;i<len;i++) G[i]=H[i];for(int i=len;i<len<<1;i++) G[i]=0;}for(int i=0;i<lim;i++) b[i]=G[i];
}int main(){freopen("ceshi.in","r",stdin);
//  freopen("sum.in","r",stdin);
//  freopen("sum.out","w",stdout);prepare();scanf("%lld%lld%lld%lld",&S,&T,&n,&m);ll C=1;for(int i=0;i<=min(m-n,S-n*T);i++)   a[i]=C,C=C*inv[i+1]%mo*((S-n*T-i)%mo)%mo;C=T;for(int i=0;i<=min(m-n,T);i++) b[i]=C,C=C*inv[i+2]%mo*((T-i-1)%mo)%mo;ll k=b[0],invk=ksm(k,mo-2);for(int i=0;i<=m-n;i++) b[i]=b[i]*invk%mo;int lim=getlim(m-n);getln(b,c,lim);for(int i=0;i<lim;i++) b[i]=c[i]*(n%mo)%mo;getexp(b,c,lim);multi(c,a,b,lim<<1);printf("%lld",(b[m-n]*ksm(k,n)%mo+mo)%mo);
}

多项式ln,exp学习小计相关推荐

  1. 【计算机本科补全计划】Mysql 学习小计(2)

    正文之前 昨天下午写了篇 Mysql学习小计,结果出乎意料的受欢迎?变相刺激了我多写点 Mysql?好吧,如尔所愿.我晚上反正还不知道学点啥,就把今天看的那个菜鸟教程学完吧,到时候估计一点了,就可以睡 ...

  2. 【计算机本科补全计划】Mysql 学习小计(3)

    正文之前 想到自己每天中午还要玩一小时手机,就自责不已,今天看成甲的好好学习一书,颇有收获,晚上写给大伙看,现在还是谢谢 Mysql,到了后面感觉越来越难了呢!! 正文 Mysql 事务 Mysql ...

  3. 学习小计(部分摘自cocos官方文档)1

     1.AutoPolygon 裁剪矩形图片的透明部分,使资源所占空间更小. AutoPolygon 是一个工具类,它可以在程序运行时,通过跟踪关键点和三角测量,将一个矩形图像划分成一系列小三角形块 ...

  4. NAO机器人学习小计

    NAO APIs nao的接口全部以AL开头,全部继承自ALModule,它被包含在<alcommon/almodule.h>中. 下面是ALModule的主要methods. ALMod ...

  5. js学习小计6-慎用return false;

    我们总是习惯用return false;来阻止ie6下a标签写了href="javascript:;"还会刷新页面,或者用来阻止冒泡. 但我们忽略了retun false;包含了两 ...

  6. js学习小计1-onbeforeunload

    作用:页面关闭或刷新时候弹出类似confirm的弹窗,确定是否刷新或关闭 一般写法: 1.html中,<body οnbefοreunlοad="return 'sure?'" ...

  7. 【计算机本科补全计划】Mysql 学习小计(1)

    正文之前 以后是要做大数据的人,如果连结构化的数据库都不会的话,那岂不是笑死人?所以果断靠着当年兴趣盎然的时候学的那点基础来复习一下,发现果然学过一遍再来复习那基本就是高中学一段内容看书与翻书的区别, ...

  8. TweenMax学习小计

    TweenMax是一款前端动画插件,可以做出很多效果,灵活性很高,最近闲暇之余学了一下,顺便做点记录. 插件的安装很简单,直接用script引入即可使用: <script src=". ...

  9. Scala学习小计 - 什么是模式匹配(pattern-matchin)?

    文章目录 简介 常量匹配 变量匹配 通配符匹配 构造器模式 类型匹配 变量绑定匹配 简介 模式匹配(pattern-matching),什么是模式(pattern)?,这里的模式用于描述一个结构的组成 ...

  10. java开发nao机器人,NAO机器人学习小计

    NAO APIs nao的接口全部以AL开头,全部继承自ALModule,它被包含在中. 下面是ALModule的主要methods. ALModule APIs namespace : AL #in ...

最新文章

  1. 某程序员吐槽:分手一个月,发现前女友和一个已婚男人在一起,愤而向他们公司举报,该男已被开除!网友:举报别人不道德!...
  2. 2019-2020年人工智能产业发展深度报告
  3. 公有云运维安全常见四大难题及解决方案
  4. java 75-76
  5. 机器学习第五章 神经网络
  6. GStreamer 入门 - Hello,World
  7. Cheat Engine 教程( 1 - 9 通关 )
  8. Kubernetes-ReplicaSet(RS)(五)
  9. Spring Boot 构建RESTful Web服务
  10. linux目录及重要文件(持续更新)
  11. 十五的学习日记20160926-你不知道的JS笔记/
  12. Java教程:Java选择结构和循环结构的总结
  13. 永中集成Office:既是创新产品,也是战略储备
  14. js 把含有转义符的字符串转成json格式
  15. 程序员该怎么创业才比较靠谱?
  16. IOS Websocket (一) Starscream实现Websocket通讯
  17. 重庆小飞龙前端第一天----了解html
  18. C2 CompilerThread9 长时间占用CPU解决方案
  19. format函数用法详解
  20. 【CYH-01】小奔的国庆练习赛:赛后标程

热门文章

  1. php excel parser pro v4.2,PHP Excel Parser Pro v4.2怎么用
  2. 矩阵拼接_numpy 矩阵拼接
  3. 怎么看vray渲染进度_VRay,corona渲染器可恢复渲染设置,再也不怕渲染参数丢失了...
  4. 卸载centos7自带java,安装oracle的jdk8
  5. MyBatis(四)------MyBatis的生命周期及配置实例
  6. (8)Spring框架----面向切面编程(AOP)的那些基础知识
  7. RDD与DataFrame
  8. win2008 server 多IP配置
  9. Asp.Net中SqlServer数据库连接方式
  10. 16年4月20号 个人总结