FFT模板

原理参考博客:https://blog.csdn.net/f_zyj/article/details/76037583

代码:

#include 
using namespace std;
typedef long long LL;
typedef long long ll;
const int MAXN= 2e5+10;
const int maxn=1e5+10;
const double PI = acos(-1.0);
struct Complex
{
    double x,y;
    inline Complex operator +(const Complex b)const {return (Complex){x+b.x,y+b.y};}
    inline Complex operator -(const Complex b)const {return (Complex){x-b.x,y-b.y}; }
    inline Complex operator *(const Complex b)const {return (Complex){x*b.x-y*b.y,x*b.y+y*b.x};}
}va[MAXN*2+MAXN/2],vb[MAXN*2+MAXN/2];
int lenth=1, rev[MAXN*2+MAXN/2];
int N, M; //f和g的数量
int f[MAXN], g[MAXN]; //f和g的系数
vector conv; //卷积结果
vector multi; //⼤数乘积
void init()
{
    int tim=0; lenth = 1;
    conv.clear(), multi.clear();
    memset( va , 0 , sizeof va);
    memset( vb , 0 , sizeof vb);
    while( lenth <= N+M-2 ) lenth<<=1,tim++;
    for( int i=0;i>1]>>1)+((i&1)<<(tim-1));
}
void FFT(Complex*A,const int fla)
{
    for( int i=0;i 1) multi.pop_back();
    reverse(multi.begin(), multi.end());
}
//事先需要设置系数f和g和数组⼤⼩N和M
//卷积结果保存conv, 乘法结果保存mult

 

你可能感兴趣的:(FFT)