为什么递归版的不T啊
查看原帖
为什么递归版的不T啊
212833
EEchoyukii楼主2020/6/13 21:51

连交两遍都不T

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
inline int read(){
	register int x=0,f=0,ch=getchar();
	while('0'>ch||ch>'9')f^=ch=='-',ch=getchar();
	while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
	return f?-x:x;
}
typedef double db;
const int MAX=2100010;
const db p=acos(-1.0);
struct c{
	db x,y;
	c(){x=y=0;}
	c(db a,db b){x=a,y=b;}
}f[MAX],g[MAX];
c operator + (c a,c b){return c(a.x+b.x,a.y+b.y);}
c operator - (c a,c b){return c(a.x-b.x,a.y-b.y);}
c operator * (c a,c b){return c(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
void FFT(int n,c *a,int op){
	if(n<=1)return ;
	register int mid=n>>1;
	c a1[mid],a2[mid];
	for(register int i=0;i<mid;++i)a1[i]=a[i<<1],a2[i]=a[i<<1|1];
	FFT(mid,a1,op);FFT(mid,a2,op);
	c w1(cos(p/mid),op*sin(p/mid)),w(1,0),x;
	for(register int i=0;i<mid;++i){
		x=w*a2[i];
		a[i]=a1[i]+x;
		a[i+mid]=a1[i]-x;
		w=w*w1;
	}
}
int n,m,k;
signed main(){
	n=read(),m=read();
	for(register int i=0;i<=n;++i)f[i].x=read();
	for(register int i=0;i<=m;++i)g[i].x=read();
	k=1;
	while(k<=n+m)k<<=1;
	FFT(k,f,1);FFT(k,g,1);
	for(register int i=0;i<=k;++i)f[i]=f[i]*g[i];
	FFT(k,f,-1);
	for(register int i=0;i<=n+m;++i)printf("%d ",(int)(f[i].x/k+0.5));
	return 0;
}


2020/6/13 21:51
加载中...