萌新求助fft,感觉没抄错为啥连样例都不对(
查看原帖
萌新求助fft,感觉没抄错为啥连样例都不对(
264548
Tangent233楼主2021/6/1 17:27
#include<bits/stdc++.h>
#define cp complex<double>
using namespace std;
const int maxn=(1<<20)+10;
const double PI=acos(-1);
cp a[maxn],b[maxn],omg[maxn],inv[maxn];
int n=1;
void fftinit()
{
	for(int i=0;i<n;i++)
	{
		omg[i]=cp(cos(2*PI*i/n),sin(2*PI*i/n));
		inv[i]=conj(omg[i]);
	}
}
void fft(cp *a,cp *omg)
{
	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=1/2;
		for(cp *p=a;p!=a+n;p+=l)
			for(int i=0;i<m;i++)
			{
				cp t=omg[n/l*i]*p[i+m];
				p[i+m]=p[i]-t;
				p[i]+=t;
			}
	}
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int main()
{
	int n1,m1;
	n1=read();m1=read();
	while(n<n1+m1) n*=2;
	int tmp;
	for(int i=0;i<=n1;i++)
	{
		tmp=read();
		a[i].real(tmp);
	}
	for(int i=0;i<=m1;i++)
	{
		tmp=read();
		b[i].real(tmp);
	}
	fftinit();
	fft(a,omg);
	fft(b,omg);
	for(int i=0;i<n;i++) a[i]*=b[i];
	fft(a,inv);
	for(int i=0;i<n;i++) printf("%d ",int(a[i].real()/n+0.5));
	return 0;
}

没想懂,抄胡小兔的

2021/6/1 17:27
加载中...