洛谷 - P3803 【模板】多项式乘法(FFT)

题目链接:点击查看

题目大意:给出两个多项式 F( x ) 和 G( x ) 的系数,求其卷积后的系数

题目分析:存一个FFT的模板,原理学不明白,数论和dp都扔给队友了,当个快乐的fw

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
#include<complex>
#define cp complex < double >
using namespace std;
const double pi=acos(-1);
 
typedef long long LL;            
 
typedef unsigned long long ull;
 
const int inf=0x3f3f3f3f;
 
const int N=1e6+100;
 
int lena=0,lenb=0,n,res[N<<2];
 
cp F[N<<2],G[N<<2],arr[N<<2],inv[N<<2];
 
void init()
{
    for (int i=0;i<n;i++)
    {
        arr[i]=cp(cos(2*pi*i/n),sin(2*pi*i/n));
        inv[i]=conj(arr[i]);
    }
}
void FFT(cp *a,cp *arr)
{
    int lim=0;
    while ((1<<lim)<n) lim++;
    for (int i=0;i<n;i++)
    {
        int t=0;
        for (int j=0;j<lim;j++)
            if ((i>>j) & 1) t|=1<<(lim-j-1);
        if (i<t) swap(a[i],a[t]);
    }
    for (int l=2;l<=n;l*=2)
    {
        int m=l/2;
        for (cp *buf=a;buf!=a+n;buf+=l)
            for (int i=0;i<m;i++)
            {
                cp t=arr[n/l*i]*buf[i+m];
                buf[i+m]=buf[i]-t;
                buf[i]+=t;
            }
    }
}
 
int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);
	scanf("%d%d",&lena,&lenb);
	lena++,lenb++;
	for(int i=0;i<lena;i++)
	{
		double num;
		scanf("%lf",&num);
		F[i].real(num);
	}
	for(int i=0;i<lenb;i++)
	{
		double num;
		scanf("%lf",&num);
		G[i].real(num);
	}
    n=1;
    while(n<(lena+lenb))
        n<<=1;
    init();
    FFT(F,arr);FFT(G,arr);
    for(int i=0;i<n;i++)
        F[i]*=G[i];
    FFT(F,inv);
    for(int i=0;i<n;i++)
        res[i]=floor(F[i].real()/n+0.5);
    for(int i=0;i<lena+lenb-1;i++)
 		printf("%d ",res[i]);













   return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45458915/article/details/108816914
今日推荐