萌新,输出非常奇怪,求助
查看原帖
萌新,输出非常奇怪,求助
1085667
KohaD_SEGA楼主2023/12/2 15:45

样例输出 1 5 7 3

#include <iostream>
#include <cmath> 
#include <cstdio>
#include <cstdlib>
#define N 1048577
using namespace std;

struct complex
{
	double x;
	double y;
	complex(): x(0),y(0){}
	complex(double X,double Y):x(X),y(Y) {}
	complex operator +(const complex& suc)
	{
		return complex(x+suc.x,y+suc.y);
	}
	complex operator -(const complex& suc)
	{
		return complex(x-suc.x,y-suc.y);
	}
	complex operator *(const complex& suc)
	{
		return complex(x*suc.x-y*suc.y,x*suc.y+y*suc.x);
	}
};

const double Pi=acos(-1);
complex A[N],B[N],ANS[N<<1];
int DD[N<<1];
int n,m;
int tot,t;
void FFT(complex* Z,int type)
{
	for(int i=0;i<tot;i++)
		if(i<DD[i])	swap(Z[i],Z[DD[i]]);
	for(int mid=1;mid<tot;mid=mid<<1)
	{
		complex r(cos(Pi/mid),type*sin(Pi/mid));
		for(int R=mid<<1,j=0;j<tot;j=j+R)
		{
			complex m(1,0);
			for(int k=0;k<mid;k++,m=m*r)
			{
				complex x=Z[j+k],y=m*Z[j+mid+k];
				Z[j+k]=x+y,Z[j+mid+k]=x-y; 
			}
		}
	} 
}

int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=0;i<=n;i++)	cin>>A[i].x;
	for(int i=0;i<=m;i++)	cin>>B[i].x;
	n=n+m;
	tot=1,t=0;
	while(tot<=n)	tot=tot<<1,t++;
	for(int i=0;i<tot;i++)	DD[i]=(DD[i>>1]>>1)+((i&1)<<(t-1));
	FFT(A,1);
	FFT(B,1);
	for(int i=0;i<tot;i++)	A[i]=A[i]*B[i];
	FFT(A,-1);
	for(int i=0;i<=n;i++)
	{
		printf("%.0lf ",A[i].x/n);
	}
	return 0;
} 
2023/12/2 15:45
加载中...