洛谷P4725 【模板】多项式对数函数(多项式运算)
前置芝士:微积分(有所了解即可)(可以看看这篇,写得非常详细我看了两章就看不下去了)
以下都是一些简单的教程切莫当真,仅供理解,建议看更严谨的
导数:对于一个函数$f(x)$,它的导数$f'(x)$为一个新的函数。简单理解的话,$f'(x)$表示在原函数图像上该点切线的斜率,记为$\frac{dy}{dx}$或$\frac{d}{dx}f(x)$
积分:对于一个导数$f'(x)$,它所对应的原函数为它的积分,记为$\int f'(x)dx$
对于一个多项式$F(x)=\sum_{i=0}^na_ix^i$来说(一个多项式实际上可以看做一个函数),它的导数和积分如下
$$F'(x)=\sum_{i=1}^nia_ix^{i-1}$$
$$\int F(x)=\sum_{i=1}^n\frac{a_ix^{i+1}}{i+1}$$
这两个是可以$O(n)$计算的,可以互相转换
然后我们要计算$ln\ F$,首先因为$ln'(x)=\frac{1}{x}$,而这里是一个多项式,根据链式法则(我也不知道什么东西),$\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}$,然后把$F(x)$带进去,得$$\frac{d}{dx}ln(F(x))=\frac{d}{dF(x)}ln(F(x))\frac{dF(x)}{dx}$$
$$\frac{d}{dx}ln(F(x))=\frac{1}{F}F'$$
$$ln(F(x))\equiv \int F'F^{-1}\pmod{x^n}$$
求导和积分的运算代码挺短的……然后剩下的基本就是多项式板子了
//minamoto
#include<iostream>
#include<cstdio>
#include<algorithm>
#define swap(x,y) (x^=y,y^=x,x^=y)
#define mul(x,y) (1ll*x*y%P)
#define add(x,y) (x+y>=P?x+y-P:x+y)
#define dec(x,y) (x-y<0?x-y+P:x-y)
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int K=-,Z;
inline void Ot(){fwrite(sr,,K+,stdout),K=-;}
inline void print(int x){
if(K><<)Ot();if(x<)sr[++K]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++K]=z[Z],--Z);sr[++K]=' ';
}
const int N=,P=;
inline int ksm(int a,int b){
int res=;
while(b){
if(b&) res=mul(res,a);
a=mul(a,a),b>>=;
}
return res;
}
int n,r[N],A[N],B[N],C[N],D[N],F[N],G[N],O[N];
void NTT(int *A,int type,int len){
int limit=,l=;
while(limit<len) limit<<=,++l;
for(int i=;i<limit;++i)
r[i]=(r[i>>]>>)|((i&)<<(l-));
for(int i=;i<limit;++i)
if(i<r[i]) swap(A[i],A[r[i]]);
for(int mid=;mid<limit;mid<<=){
int R=mid<<,Wn=ksm(,(P-)/R);O[]=;
for(int j=;j<limit;++j) O[j]=mul(O[j-],Wn);
for(int j=;j<limit;j+=R){
for(int k=;k<mid;++k){
int x=A[j+k],y=mul(O[k],A[j+k+mid]);
A[j+k]=add(x,y),A[j+k+mid]=dec(x,y);
}
}
}
if(type==-){
reverse(A+,A+limit);
for(int i=,inv=ksm(limit,P-);i<limit;++i)
A[i]=mul(A[i],inv);
}
}
void Inv(int *a,int *b,int len){
if(len==) return (void)(b[]=ksm(a[],P-));
Inv(a,b,len>>);int l=len<<;
for(int i=;i<len;++i) C[i]=a[i],D[i]=b[i];
NTT(C,,l),NTT(D,,l);
for(int i=;i<l;++i) C[i]=mul(mul(C[i],D[i]),D[i]);
NTT(C,-,l);
for(int i=;i<len;++i) b[i]=dec(add(b[i],b[i]),C[i]);
}
void Direv(int *A,int *B,int len){
//求导
for(int i=;i<len;++i) B[i-]=mul(A[i],i);B[len-]=;
}
void Inter(int *A,int *B,int len){
//积分
for(int i=;i<len;++i) B[i]=mul(A[i-],ksm(i,P-)),B[]=;
}
void Ln(int *a,int *b,int len){
Direv(a,A,len),Inv(a,B,len);int l=len<<;
NTT(A,,l),NTT(B,,l);
for(int i=;i<l;++i) A[i]=mul(A[i],B[i]);
NTT(A,-,l),Inter(A,b,len);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
for(int i=;i<n;++i) F[i]=read();
int len;for(len=;len<n;len<<=);
Ln(F,G,len);
for(int i=;i<n;++i) print(G[i]);
Ot();
return ;
}
洛谷P4725 【模板】多项式对数函数(多项式运算)的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 【洛谷 P4934】 礼物 (位运算+DP)
题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷P3385 [模板]负环 [SPFA]
题目传送门 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个 ...
随机推荐
- vc常用类总结(转载)
常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right.分别表是左上角和右下角的坐标.可以通过以下的方法构造: CRect( int l, int t, i ...
- JS基础——构造函数VS原型
JS是一种基于对象的语言.在使用过程中不免遇到复制对象的问题.但通常我们採用的直接赋值'obj1=obj2'这样的做法会出现数据覆盖问题. 也就是对象引用过程中引用地址一致.导致对象数据被改动的问题. ...
- [游戏]L4D求生之路官方比赛地图修补完好说明
游戏模式:L4D求生之路4356(1.0.2.1)药抗比赛模式 更新日期:2015.06.04 -----毫不留情01----- 1.开局补给手枪 -----毫不留情02----- 1.开局补给手枪 ...
- 基于ADB框架Robotium跨进程操作
转自:http://blog.csdn.net/qingchunjun/article/details/42580937 2015年2月3日更新: 有些朋友在用真机尝试本方法时,抛出了InputStr ...
- Javascript对象的技巧和陷阱
创建对象的3种方法 方法1 直接创建 var obj = { name: "mike", age: 10 } 方法2 用new创建 var ob = new Date(); 方法3 ...
- NPOI实现Excel导入
导入功能实现: ]; GetExtensionsFromFileStream(file.InputStream); using NPOI.XSSF.UserModel; public List< ...
- Delphi ActiveForm发布全攻略
论坛上很多朋友(也包括我)提到ActiveForm的发布问题,都没有得到很好的解决.下面是本人开发ActiveForm的一点经验,拿出来跟大家分享,开发环境为 Win2000Server,IIS5.0 ...
- PHP的date 函数
<!DOCTYPE html> <html> <body> <?php echo "今天是 " . date("Y/m/d&qu ...
- Linux时间子系统之(一):时间的基本概念【转】
本文转载自:http://www.wowotech.net/timer_subsystem/time_concept.html 本文使用Q & A的方式来和大家以前探讨一下时间的基本概念 一. ...
- 计算一个大数n的阶乘的位数宽度(十进制)(log i累加法 )
输入: 每行输入1个正整数n, (0<n<1000 000) 输出: 对于每个n,输出n!的(十进制)位数. 分析: 这道题采用蛮力法.根据定义,直接求解! 所谓n!的十进制位数,就是 l ...