我是靠谱客的博主 鲤鱼大树,最近开发中收集的这篇文章主要介绍洛谷P3803 【模板】多项式乘法(FFT),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Code: 

#include<bits/stdc++.h>
#define maxn 5000001
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
const double pi=acos(-1.0);
struct cpx
{
double x,y;
cpx(double a=0,double b=0) {x=a, y=b; }
cpx operator+(const cpx b) { return cpx(x+b.x,y+b.y); }
cpx operator-(const cpx b) { return cpx(x-b.x,y-b.y); }
cpx operator*(const cpx b) { return cpx(x*b.x-y*b.y,x*b.y+y*b.x); }
}A[maxn],B[maxn];
void FFT(cpx *a,int n,int flag)
{
for(int i=0,k=0;i<n;++i)
{
if(i>k) swap(a[i], a[k]);
for(int j=n>>1;(k^=j)<j;j>>=1);
}
for(int mid=1;mid<n;mid<<=1)
{
cpx wn(cos(pi/mid), flag*sin(pi/mid)),x,y;
for(int j=0;j<n;j+=(mid<<1))
{
cpx w(1,0);
for(int k=0;k<mid;++k)
{
x=a[j+k], y=w*a[j+k+mid];
a[j+k]=x+y,a[j+k+mid]=x-y;
w=w*wn;
}
}
}
if(flag==-1)
for(int i=0;i<n;++i) a[i].x/=(double)n;
}
int main()
{
// setIO("input");
int n,m,len=1;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;++i) scanf("%lf",&A[i].x);
for(int i=0;i<=m;++i) scanf("%lf",&B[i].x);
for(len=1;len<(n+m+1);len<<=1);
FFT(A, len, 1), FFT(B, len, 1);
for(int i=0;i<len;++i) A[i]=A[i]*B[i];
FFT(A, len, -1);
for(int i=0;i<=n+m;++i) printf("%d ",(int)(A[i].x+0.5));
return 0;
}

  

转载于:https://www.cnblogs.com/guangheli/p/10014711.html

最后

以上就是鲤鱼大树为你收集整理的洛谷P3803 【模板】多项式乘法(FFT)的全部内容,希望文章能够帮你解决洛谷P3803 【模板】多项式乘法(FFT)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部