自己整理出来的模板

存在的问题:

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. MaxScale中间件部署数据库读写分离

    操作系统:CentOS7 (Core) 数据库:MariaDB-10.2.6-linux-glibc_214-x86_64 MaxScale服务器:192.168.40.134 主服务器:192.16 ...

  2. mariadb数据库集群

    1.主从架构: 每个从节点需要一个dump线程连接主节点 异步:效率高,安全性低,有延迟 同步:效率低,安全性高,无延迟 主:可读可写,(dump thread) 从:可读不可写 (sql threa ...

  3. mobile/immobile species的区别

    在地下水反应运移模型中: “mobile species” 涉及运移和反应过程(transport+reaction) “immobile” species 只涉及反应过程 (reaction)

  4. Linux C/C++基础——内存分区

    1.内存分区 在生活中,为了提高办事效率,某个单位经常会分成N个部门,每个部门职责不同,同样,为了提高 效率,我们的内存也会被分成N个区.这里我们将内存分为五个区.也有四区模型. 首先看一下一个二进制 ...

  5. SolidWorks学习笔记7 镜像,阵列

    镜像 将特征,面,实体相对于一个平面来复制.修改原来的特征,镜像特征随之改变 阵列 线性阵列 , 在左侧,先激活要阵列的特征,然后点击小柱 然后选择方向1和方向2,该方向的阵列距离和数量(一般使用边线 ...

  6. [转帖]忘记了MariaDB root密码的解决办法

    忘记了MariaDB root密码的解决办法 https://www.cnblogs.com/liaojie970/p/6126322.html 貌似跟 mysql 是一样的. 1.停掉mariaDB ...

  7. 计算机和python

    计算机基础知识 CPU 人类的大脑 运算和处理问题 内存 临时存储数据 断电就消失了 硬盘 永久 存储数据 操作系统是一个(特殊)的程序,调度硬件和软件之间的数据交互 python的应用和历史 IT, ...

  8. Momentum Contrast for Unsupervised Visual Representation Learning

    Momentum Contrast for Unsupervised Visual Representation Learning 一.Methods Previously Proposed 1. E ...

  9. 07-django项目连接远程mysql数据库

    比如电脑a(ip地址为192.168.0.aaa)想要连接访问电脑b(ip地址为192.168.0.bbb)的数据库: 对电脑a(ip地址为192.168.0.aaa): 在项目settings.py ...

  10. access注入

    前面有自己总结详细的mysql注入,自己access注入碰到的比较少,虽然比较简单,但是这里做一个总结 union联合查询法: 因为union前后字段数相同,所以可以先用order by 22 使查询 ...