自己整理出来的模板

存在的问题:

1.多项式求逆常数过大(尤其是浮点数FFT)

2.log只支持f[0]=1的情况,exp只支持f[0]=0的情况

有待进一步修改和完善

FFT:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const db pi=acos(-);
const int N=4e5+,M=1e6+,mod=;
int n,m,n2,a[N];
int Pow(int x,int p) {
int ret=;
for(; p; p>>=,x=(ll)x*x%mod)if(p&)ret=(ll)ret*x%mod;
return ret;
}
struct P {
db x,y;
P operator+(const P& b) {return {x+b.x,y+b.y};}
P operator-(const P& b) {return {x-b.x,y-b.y};}
P operator*(const P& b) {return {x*b.x-y*b.y,x*b.y+y*b.x};}
P operator/(db b) {return {x/b,y/b};}
P cj() {return {x,-y};}
};
struct F_FT {
P A[N],B[N],w[N];
int b[N],c[N],d[N],e[N],f[N];
void FFT(P* a,int n,int f) {
for(int i=,j=n>>,k; i<n-; ++i,j^=k) {
if(i<j)swap(a[i],a[j]);
for(k=n>>; j&k; j^=k,k>>=);
}
for(int i=; i<n; ++i)w[i]= {cos(*pi*i/n),sin(*pi*i/n)};
for(int k=; k<n; k<<=)
for(int i=; i<n; i+=k<<)
for(int j=i; j<i+k; ++j) {
P W= {w[n//k*(j-i)].x,~f?w[n//k*(j-i)].y:-w[n//k*(j-i)].y};
P x=a[j],y=W*a[j+k];
a[j]=x+y,a[j+k]=x-y;
}
if(!~f)for(int i=; i<n; ++i)a[i]=a[i]/n;
}
void mul(int* a,int* b,int* c,int n) {
for(int i=; i<n; ++i)A[i]= {a[i]>>,a[i]&((<<)-)},B[i]= {b[i]>>,b[i]&((<<)-)},A[i+n]= {,},B[i+n]= {,};
n<<=;
FFT(A,n,),FFT(B,n,);
for(int i=; i<=n/; ++i) {
int j=(n-i)&(n-);
P a1=(A[i]+A[j].cj())* (P) {0.5,},b1=(A[i]-A[j].cj())* (P) {,-0.5};
P a2=(B[i]+B[j].cj())* (P) {0.5,},b2=(B[i]-B[j].cj())* (P) {,-0.5};
P a3=(A[j]+A[i].cj())* (P) {0.5,},b3=(A[j]-A[i].cj())* (P) {,-0.5};
P a4=(B[j]+B[i].cj())* (P) {0.5,},b4=(B[j]-B[i].cj())* (P) {,-0.5};
A[i]=a1*a2+b1*b2* (P) {,},B[i]=a1*b2+a2*b1;
A[j]=a3*a4+b3*b4* (P) {,},B[j]=a3*b4+a4*b3;
}
FFT(A,n,-),FFT(B,n,-);
for(int i=; i<n; ++i)c[i]=(((ll(A[i].x+0.5)%mod)<<)+ll(A[i].y+0.5)+(ll(B[i].x+0.5)<<))%mod;
}
void inverse(int* a,int n) {
for(int i=; i<n; ++i)b[i]=;
b[]=Pow(a[],mod-);
for(int m=; m<=n; m<<=) {
mul(b,b,c,m),mul(a,c,c,m);
for(int i=; i<m; ++i)b[i]=(((ll)b[i]*-c[i])%mod+mod)%mod;
}
for(int i=; i<n; ++i)a[i]=b[i];
}
void der(int* a,int n) {for(int i=; i<n; ++i)a[i-]=(ll)i*a[i]%mod; a[n-]=;}
void itg(int* a,int n) {for(int i=n-; i>=; --i)a[i+]=(ll)Pow(i+,mod-)*a[i]%mod; a[]=;}
void log(int* a,int n) {
for(int i=; i<n; ++i)d[i]=a[i];
inverse(d,n),der(a,n),mul(a,d,a,n),itg(a,n);
}
void exp(int* a,int n) {
for(int i=; i<n; ++i)e[i]=;
e[]=;
for(int m=; m<=n; m<<=) {
for(int i=; i<m; ++i)f[i]=e[i];
log(f,m);
for(int i=; i<m; ++i)f[i]=(a[i]-f[i]+mod)%mod;
f[]++;
mul(e,f,e,m);
}
for(int i=; i<n; ++i)a[i]=e[i];
}
void pow(int* a,int n,int p) {
int j=;
for(; j<n&&!a[j]; ++j);
if(j==n)return;
int px=Pow(a[j],p),invx=Pow(a[j],mod-);
for(int i=j; i<n; ++i)a[i-j]=(ll)a[i]*invx%mod;
for(int i=n-j; i<n; ++i)a[i]=;
log(a,n);
for(int i=; i<n; ++i)a[i]=(ll)a[i]*p%mod;
exp(a,n);
for(int i=n-; i>=(ll)j*p; --i)a[i]=(ll)a[i-j*p]*px%mod;
for(int i=; i<n&&i<(ll)j*p; ++i)a[i]=;
}
} fft;
int main() {
scanf("%d%d",&n,&m);
for(int i=; i<n; ++i)scanf("%d",&a[i]),a[i]%=mod;
for(n2=; n2<n; n2<<=);
fft.pow(a,n2,m);
for(int i=; i<n; ++i)printf("%d%c",a[i]," \n"[i==n-]);
return ;
}

NTT:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+,M=1e6+,mod=;
const int G=;
int n,m,n2,a[N];
int Pow(int x,int p) {
int ret=;
for(; p; p>>=,x=(ll)x*x%mod)if(p&)ret=(ll)ret*x%mod;
return ret;
}
struct F_FT {
int A[N],B[N],b[N],c[N],d[N],e[N],f[N];
void FFT(int* a,int n,int f) {
for(int i=,j=n>>,k; i<n-; ++i,j^=k) {
if(i<j)swap(a[i],a[j]);
for(k=n>>; j&k; j^=k,k>>=);
}
for(int k=; k<n; k<<=) {
int gn=Pow(G,(mod-)/(k<<));
if(f==-)gn=Pow(gn,mod-);
for(int i=; i<n; i+=k<<) {
int g=;
for(int j=i; j<i+k; ++j,g=(ll)g*gn%mod) {
int x=a[j],y=(ll)g*a[j+k]%mod;
a[j]=((ll)x+y)%mod,a[j+k]=((ll)x-y+mod)%mod;
}
}
}
if(!~f) {
int invn=Pow(n,mod-);
for(int i=; i<n; ++i)a[i]=(ll)a[i]*invn%mod;
}
}
void mul(int* a,int* b,int* c,int n) {
for(int i=; i<n; ++i)A[i]=a[i],B[i]=b[i],A[i+n]=B[i+n]=;
n<<=;
FFT(A,n,),FFT(B,n,);
for(int i=; i<n; ++i)c[i]=(ll)A[i]*B[i]%mod;
FFT(c,n,-);
}
void inverse(int* a,int n) {
for(int i=; i<n; ++i)b[i]=;
b[]=Pow(a[],mod-);
for(int m=; m<=n; m<<=) {
for(int i=; i<m; ++i)A[i]=a[i],B[i]=b[i],A[i+m]=B[i+m]=;
FFT(A,m<<,),FFT(B,m<<,);
for(int i=; i<(m<<); ++i)b[i]=(((ll)B[i]*-(ll)A[i]*B[i]%mod*B[i]%mod)%mod+mod)%mod;
FFT(b,m<<,-);
for(int i=m; i<(m<<); ++i)b[i]=;
}
for(int i=; i<n; ++i)a[i]=b[i];
}
void der(int* a,int n) {for(int i=; i<n; ++i)a[i-]=(ll)i*a[i]%mod; a[n-]=;}
void itg(int* a,int n) {for(int i=n-; i>=; --i)a[i+]=(ll)Pow(i+,mod-)*a[i]%mod; a[]=;}
void log(int* a,int n) {
for(int i=; i<n; ++i)d[i]=a[i];
inverse(d,n),der(a,n),mul(a,d,a,n),itg(a,n);
}
void exp(int* a,int n) {
for(int i=; i<n; ++i)e[i]=;
e[]=;
for(int m=; m<=n; m<<=) {
for(int i=; i<m; ++i)f[i]=e[i];
log(f,m);
for(int i=; i<m; ++i)f[i]=(a[i]-f[i]+mod)%mod;
f[]++;
mul(e,f,e,m);
}
for(int i=; i<n; ++i)a[i]=e[i];
}
void pow(int* a,int n,int p) {
int j=;
for(; j<n&&!a[j]; ++j);
if(j==n)return;
int px=Pow(a[j],p),invx=Pow(a[j],mod-);
for(int i=j; i<n; ++i)a[i-j]=(ll)a[i]*invx%mod;
for(int i=n-j; i<n; ++i)a[i]=;
log(a,n);
for(int i=; i<n; ++i)a[i]=(ll)a[i]*p%mod;
exp(a,n);
for(int i=n-; i>=(ll)j*p; --i)a[i]=(ll)a[i-j*p]*px%mod;
for(int i=; i<n&&i<(ll)j*p; ++i)a[i]=;
}
} fft;
int main() {
scanf("%d%d",&n,&m);
for(int i=; i<n; ++i)scanf("%d",&a[i]),a[i]%=mod;
for(n2=; n2<n; n2<<=);
fft.pow(a,n2,m);
for(int i=; i<n; ++i)printf("%d%c",a[i]," \n"[i==n-]);
return ;
}

代码源自洛谷P4238

多项式FFT/NTT模板(含乘法/逆元/log/exp/求导/积分/快速幂)的更多相关文章

  1. 洛谷 P3811 【模板】乘法逆元

    P3811 [模板]乘法逆元 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下 ...

  2. 多项式FFT相关模板

    自己码了一个模板...有点辛苦...常数十分大,小心使用 #include <iostream> #include <stdio.h> #include <math.h& ...

  3. P3811 【模板】乘法逆元

    P3811 [模板]乘法逆元 线性递推逆元模板 #include<iostream> #include<cstdio> #include<cstring> #def ...

  4. [洛谷P3811]【模板】乘法逆元

    P3811 [模板]乘法逆元 题意 求1-n所有整数在模p意义下的逆元. 分析 逆元 如果x满足\(ax=1(\%p)\)(其中a p是给定的数)那么称\(x\)是在\(%p\)意义下\(a\)的逆元 ...

  5. 模板【洛谷P3811】 【模板】乘法逆元

    P3811 [模板]乘法逆元 给定n,p求1~n中所有整数在模p意义下的乘法逆元. T两个点的费马小定理求法: code: #include <iostream> #include < ...

  6. 洛谷——P3811 【模板】乘法逆元

    P3811 [模板]乘法逆元 线性求逆元 逆元定义:若$a*x\equiv1 (\bmod {b})$,且$a$与$b$互质,那么我们就能定义: $x$为$a$的逆元,记为$a^{-1}$,所以我们也 ...

  7. 题解 P3811 【【模板】乘法逆元】

    P3811 [模板]乘法逆元 一个刚学数论的萌新,总结了一下这题的大部分做法 //一.费马小定理+快速幂 O(nlogn) 64分 #include<cstdio> using names ...

  8. 逆元-P3811 【模板】乘法逆元-洛谷luogu

    https://www.cnblogs.com/zjp-shadow/p/7773566.html -------------------------------------------------- ...

  9. luogu P3811 【模板】乘法逆元

    题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下的逆元. 输入输出样例 输入样 ...

随机推荐

  1. Python flask 与 GO WEB服务器性能对比

    测试环境: 系统: CentOS 7.1 Mem: 8G CPU: 虚拟机16核 Python版本: python3.6 Flask版本: 0.12.2 Golang版本: 1.6.3 1.首先写一个 ...

  2. 怎样提高js的编程能力

    1,学习js分几个阶段,没入门,入门初学者,中级水平,高级水平,ppt水平. 2,没入门的如何学习? 我当初是先学jquery,有css和html基础,有css基础看jq的语法很简单,就是选择符,jq ...

  3. “vmware 未能初始化监视器设备”的解决方法

    从挂起状态唤醒时出现"vmware 未能初始化监视器设备"的提示,在cmd中输入命令 net start vmci net start vmx86 可能还不能成功启动,提示&quo ...

  4. pthon基础知识(索引、切片、序列相加、乘法、检查元素是否是序列成员、计算序列长度、最大最小值)

    序列   数据存储方式  数据结构 python 列表.元组.字典.集合.字符串 序列: 一块用于存放多个值的连续内存空间,并且按一定顺序排列,可以通过索引取值 索引(编号): 索引可以是负数 从左到 ...

  5. 目前最新u盘启动快捷热键一览表

    现在重装系统已不再是件难事了,一个普通的u盘就可以帮你搞定,但是对于一些新手来说在使用u盘启动盘安装系统是也许会遇到这样的小问题,面对一台新电脑时不知道该如何让电脑优先访问u盘从而进入PE系统下进行装 ...

  6. JAVA SQL注入漏洞挖掘

    java中sql注入主要发生在model层,黑盒测试sql注入的方法结合两点:1,异常注入后,界面有无明显的aql异常报出.2,查看数据库日志是否有脏数据注入. preparestatement方法是 ...

  7. 【神经网络与深度学习】【C/C++】ZLIB学习2

    Zlib文件压缩和解压 开源代码:http://www.zlib.net/ zlib使用手册:http://www.zlib.net/manual.html zlib wince版:http://ww ...

  8. Construct String from Binary Tree

    You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...

  9. sql server2012中使用convert来取得datetime数据类型样式(全)

    一.日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/*时间一般为getdate()函数或数据表里的字段*/ CONV ...

  10. oracle数据库表恢复到特定时间点

    某一张表被应用软件里误操作把数据都清空了,现在想恢复到清空之间,比如2013年8月13日14点以前,应该怎样操作? 通过这个问题可以引发一系列的知识点串联. 1.如果开启闪回可以使用闪回表. 怎样查看 ...