提交记录 5183


用户 题目 状态 得分 用时 内存 语言 代码长度
f321dd 1002. 测测你的多项式乘法 Accepted 100 189.121 ms 65168 KB C++ 1.77 KB
提交时间 评测时间
2018-08-10 13:55:17 2020-08-01 00:13:38
#pragma GCC target("sse2")
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<immintrin.h>
#define get(a,i)((double*)&a)[i]
typedef unsigned u32;
typedef __m128d vec;
inline vec mul(vec a,vec b){
	vec u=_mm_mul_pd(a,b);
	vec v=_mm_mul_pd(a,_mm_loadr_pd((double*)&b));
	return _mm_setr_pd(get(u,0)-get(u,1),get(v,0)+get(v,1));
}
using namespace std;
const u32 N=1<<20;
const double pi=acos(-1.);
inline vec conj(vec a){
	return _mm_setr_pd(get(a,0),-get(a,1));
}
vec w[N/2],a[N],b[N],c[N];
void fft(vec*a,u32 n){
	for(u32 i=0,j=0;i<n;++i){
		if(i<j)
			swap(a[i],a[j]);
		for(u32 k=n>>1;;k>>=1)
			if((j^=k)>=k)break;
	}
	w[0]=_mm_set_sd(1);
	for(u32 i=1;i<n;i<<=1){
		vec s=_mm_setr_pd(cos(pi/i),sin(pi/i));
		for(int j=i-2;j>0;j-=2)
			w[j]=w[j>>1];
		for(u32 j=1;j<i;j+=2)
			w[j]=mul(s,w[j-1]);
		for(u32 j=0;j<n;j+=i<<1){
			vec*b=a+j,*c=b+i;
			for(u32 k=0;k<i;++k){
				vec v=mul(w[k],c[k]);
				c[k]=_mm_sub_pd(b[k],v);
				b[k]=_mm_add_pd(b[k],v);
			}
		}
	}
}
void read(u32*f,u32 n,vec*a){
	for(u32 i=0;i<n/2;++i)
		a[i]=_mm_setr_pd(f[i*2],f[i*2+1]);
	if(n&1)
		a[n/2]=_mm_set_sd(f[n-1]);
}
void poly_multiply(u32*a,int n,u32*b,int m,u32*c){
	++n,++m;
	if(min(n,m)<=10){
		fill_n(c,n+m-1,0);
		for(u32 i=0;i<m;++i)
			for(u32 j=0;j<n;++j)
				c[i+j]+=b[i]*a[j];
	}else{
		u32 l=1<<__lg(n+m-1);
		read(a,n,::a);
		read(b,m,::b);
		vec*a=::a,*b=::b;
		fft(a,l);
		fft(b,l);
		for(u32 i=0;i<l;++i){
			u32 j=l-i&l-1;
			::c[j]=mul(_mm_setr_pd(0,.25),_mm_sub_pd(mul(conj(mul(a[j],b[j])),_mm_set_sd(4)),mul(mul(_mm_sub_pd(conj(a[j]),a[i]),_mm_sub_pd(conj(b[j]),b[i])),_mm_add_pd(i<l/2?w[i]:mul(w[i-l/2],_mm_set_sd(-1)),_mm_set_sd(1)))));
		}
		fft(::c,l);
		for(u32 i=0;i<n+m-1;++i)
			c[i]=get(::c[i>>1],~i&1)/l+.5;
	}
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #1189.121 ms63 MB + 656 KBAcceptedScore: 100


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-12 08:21:54 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠