社区讨论

非递归 fft33pts求调 没过样例

P3803【模板】多项式乘法(FFT)参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mjxle5d4
此快照首次捕获于
2026/01/03 08:56
2 个月前
此快照最后确认于
2026/01/06 09:35
上个月
查看原帖
CPP
#include<bits/stdc++.h>
#define MAXN 4000010
using namespace std;
const int N=4e6+6,PI=acos(1.0);
int n,m,rev[N];
struct fs{
	double real,imag;
	fs(){real=imag=0.0;}
	fs(double x){real=x,imag=0.0;}
	fs(double x,double y){real=x,imag=y;}
	fs operator+(fs a)const{
		return fs(real+a.real,imag+a.imag);
	}
	fs operator-(fs a)const{
		return fs(real-a.real,imag-a.imag);
	}
	fs operator*(fs a)const{
		return fs(real*a.real-imag*a.imag,real*a.imag+imag*a.real);
	}
	inline void operator/=(double x){
		real/=x,imag/=x;
	}
}A[N],B[N],u[N];
inline void FFT(fs *A,int size,bool flag){
	rev[0]=0;
	for(int i=1;i<size;i++){
		rev[i]=rev[i>>1]>>1;
		if(i&1)rev[i]|=(size>>1);
	}
	for(int i=0;i<size;i++)if(rev[i]>i)swap(A[i],A[rev[i]]);
	double ang=(flag?2.0:-2.0)*PI/(double)size;
	fs mul(cos(ang),sin(ang));
	u[0]=fs(1,0);
	for(int i=1;i<size/2;i++)u[i]=u[i-1]*mul;
	for(int step=2;step<=size;step<<=1){
		int gap=step>>1,addgap=size/step;
		for(int i=0;i<size;i+=step){
			for(int j=i;j<i+gap;j++){
				int k1=(j-i)*addgap;
				int k2=k1+addgap*gap;
				fs new1=A[j]+A[j+gap]*u[k1];
				fs new2=A[j]-A[j+gap]*u[k1];
				A[j]=new1,A[j+gap]=new2;
			}
		}
	}
	if(!flag)for(int i=0;i<size;i++)A[i]/=(double)size;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;n++,m++;
	int sz=1;
	while(sz<n+m-1)sz<<=1;
	for(int i=0;i<n;i++){
		int x;cin>>x;A[i]=fs(x);
	}
	for(int i=0;i<m;i++){
		int x;cin>>x;B[i]=fs(x);
	}
	FFT(A,sz,true);FFT(B,sz,true); 
	for(int i=0;i<sz;i++)A[i]=A[i]*B[i];
	FFT(A,sz,false);
	for(int i=0;i<n+m-1;i++)cout<<(int)(A[i].real+0.5)<<' ';
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...