WA 50pts FFT求调,悬关
查看原帖
WA 50pts FFT求调,悬关
408557
Xuan_qwq楼主2025/1/10 19:47

rt,提交记录

#include<bits/stdc++.h>
using namespace std;
#define int long long
const double pai=acos(-1.0);
const int N=400005,M=32768;
struct CC {
	double a,b;
	CC(){}
	CC(double a,double b):a(a),b(b){}
	CC operator + (CC i)const{return (CC){a+i.a,b+i.b};}
	CC operator - (CC i)const{return (CC){a-i.a,b-i.b}; }
	CC operator * (CC i)const{return (CC){a*i.a-b*i.b,a*i.b+b*i.a}; }
}A[N],B[N],C[N],D[N],E[N],F[N],G[N],H[N];
int f[N],g[N];
int n,m,mod,L,r[N],O[N];
void fft(CC *A,int lim,int opt){
	for(int i=0;i<lim;i++)if(i<r[i])swap(A[i],A[r[i]]);
	for(int mid=1;mid<lim;mid<<=1){
		CC w=CC(cos(pai/mid),opt*sin(pai/mid));
		
		for(int i=0;i<lim;i+=mid<<1){
			CC p=CC(1,0);
			for(int j=0;j<mid;j++,p=p*w){
				CC u=A[i+j],v=p*A[i+mid+j];
				A[i+j]=u+v;
				A[i+mid+j]=u-v;
			}
		}
	}
}
signed main(){
//	freopen("P4245_11.in","r",stdin);
//	freopen("test.out","w",stdout);
	cin>>n>>m>>mod;
	for(int i=0;i<=n;i++){
		cin>>f[i];f[i]%=mod;
		A[i]=CC(f[i]/M,0);
		B[i]=CC(f[i]%M,0);
	}
	for(int i=0;i<=m;i++){
		cin>>g[i];g[i]%=mod;
		C[i]=CC(g[i]/M,0);
		D[i]=CC(g[i]%M,0);
	}
	int lim=1;
	while(lim<=n+m)lim<<=1,L++;
	for(int i=0;i<lim;i++)r[i]=(r[i>>1]>>1|((i&1)<<(L-1)));
	
	fft(A,lim,1);fft(B,lim,1);fft(C,lim,1);fft(D,lim,1);
	for(int i=0;i<=lim;i++)E[i]=A[i]*C[i],F[i]=B[i]*C[i],G[i]=A[i]*D[i],H[i]=B[i]*D[i];
	fft(E,lim,-1);fft(F,lim,-1);fft(G,lim,-1);fft(H,lim,-1);
	for(int i=0;i<=n+m;i++)
		cout<<((int)(E[i].a/lim+0.5)%mod*M%mod*M%mod+(int)(F[i].a/lim+0.5)%mod*M%mod+(int)(G[i].a/lim+0.5)%mod*M%mod+(int)(H[i].a/lim+0.5)%mod)%mod<<" ";
	return 0;
}
2025/1/10 19:47
加载中...