其他分享
首页 > 其他分享> > FFT 学习笔记

FFT 学习笔记

作者:互联网

待填

代码

#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;++i)
#define lod double
using namespace std;
const int n7=3012345;
const lod pie=acos(-1);
int n,m,rv[n7];

struct mle{lod x,y;}a[n7],b[n7];
mle operator + (mle p,mle q){return (mle){p.x+q.x,p.y+q.y};}
mle operator - (mle p,mle q){return (mle){p.x-q.x,p.y-q.y};}
mle operator * (mle p,mle q){return (mle){p.x*q.x-p.y*q.y,p.x*q.y+p.y*q.x};}

int rd(){
	int shu=0;char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))shu=(shu<<1)+(shu<<3)+ch-'0',ch=getchar();
	return shu;
}

void FFT(mle *c,bool sys){
	rep(i,0,n-1)if(i<rv[i])swap(c[i],c[ rv[i] ]);
	for(int len=2;len<=n;len<<=1){
		mle ori=(mle){cos(2*pie/len),(sys?1:-1)*sin(2*pie/len)};
		int le=(len>>1);
		for(int i=0;i<n;i+=len){
			mle z=(mle){1,0};
			rep(j,i,i+le-1){
				mle tmp=z*c[le+j];
				c[le+j]=c[j]-tmp;
				c[j]=c[j]+tmp;
				z=z*ori;
			}
		}
	}
}

int main(){
	n=rd(),m=rd();
	rep(i,0,n)a[i].x=rd();
	rep(i,0,m)b[i].x=rd();
	m=m+n,n=1;
	while(n<=m)n=n<<1;
	rep(i,0,n-1){
		rv[i]=(rv[i>>1]>>1);
		if(i&1)rv[i]=rv[i]|(n>>1);
	}
	FFT(a,1),FFT(b,1);
	rep(i,0,n)a[i]=a[i]*b[i];
	FFT(a,0);
	rep(i,0,m)printf("%d ",(int)(a[i].x/n+0.5));
	return 0;
}

标签:rv,return,int,rep,FFT,0.5,笔记,学习
来源: https://www.cnblogs.com/BlankAo/p/14333216.html