提交记录 15688


用户 题目 状态 得分 用时 内存 语言 代码长度
123456zmy 1002i. 【模板题】多项式乘法 Accepted 100 184.605 ms 14056 KB C++ 2.76 KB
提交时间 评测时间
2021-01-25 11:02:15 2021-01-25 11:02:21
#include<bits/stdc++.h>
#include<immintrin.h>
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast")
#define _SIZE_ 100000
char _b[_SIZE_],*_b1,*_b2;
#define getc() (_b1==_b2?fread(_b,1,_SIZE_,stdin),_b2=_b+_SIZE_,*((_b1=_b)++):*(_b1++))
#define read(__x) {register signed _x(0);register char _c=getc(),_f(0);for(;_c<47;_c=getc())_f=(_c==45);for(;_c>47;_c=getc())_x=_x*10+(_c^48);_f&&(_x=-_x),__x=_x;}
char _d[_SIZE_],*_p=_d;
#define putc(__c) (_p-_d==_SIZE_?fwrite(_d,1,_SIZE_,stdout),_p=_d,*_p++=__c:*_p++=__c)
#define write(__x) {register signed _x=__x;(_x<0)&&(putc(45),_x=-_x);static signed _q[11];register char _t=0;do{_q[_t++]=_x%10,_x/=10;}while(_x);while(_t)putc(_q[--_t]+48);}
#define fwflush() (fwrite(_d,1,_p-_d,stdout),_p=_d)
#define pi 3.14159265358979323846
#define add(_x,_y) _mm256_add_pd(_x,_y)
#define sub(_x,_y) _mm256_sub_pd(_x,_y)
#define mul(_x,_y) _mm256_mul_pd(_x,_y)
#define fma(_x,_y,_z) _mm256_fmadd_pd(_x,_y,_z)
#define fnma(_x,_y,_z) _mm256_fnmadd_pd(_x,_y,_z)
struct C
{
    double x,y;
    C operator+(const C b)const{return {x+b.x,y+b.y};} 
	C operator-(const C b)const{return {x-b.x,y-b.y};}
	C operator*(const C b)const{return {x*b.x-y*b.y,x*b.y+y*b.x};}
};
struct mm256_C
{
	__m256d x,y;
	mm256_C operator+(const mm256_C b)const{return {add(x,b.x),add(y,b.y)};}
	mm256_C operator-(const mm256_C b)const{return {sub(x,b.x),sub(y,b.y)};}
	mm256_C operator*(const mm256_C b)const{return {fnma(y,b.y,mul(x,b.x)),fma(y,b.x,mul(x,b.y))};}
};
const int _lg2[]={0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3};
using namespace std;
int tmp1,n,m,N;
int lg2(int i)
{
	int tmp(0);
	if(i>65535)tmp|=16,i>>=16;
	if(i>255)tmp|=8,i>>=8;
	if(i>15)tmp|=4,i>>=4;
	return tmp+_lg2[i];
}
double co[21],si[21];
void fft(C*a,int n)
{
	if(n==1)return;
	int mid=n>>1;
	C b[n],x__={1,0},x_={co[lg2(n)],si[lg2(n)]};
	for(int i=0;i<mid;i++)b[i]=a[i<<1];
	for(int i=0;i<mid;i++)b[i|mid]=a[i<<1|1];
	fft(b,mid),fft(b+mid,mid);
	for(int i=0;i<mid;i++,x__=x__*x_)
	{
		C x(b[i+mid]*(C){x__.x,x__.y});
		a[i]=b[i]+x,a[i+mid]=b[i]-x;
	}
}
void ifft(C*a,int n)
{
	if(n==1)return;
	int mid=n>>1;
	C b[n],x__={1,0},x_={co[lg2(n)],si[lg2(n)]};
	for(int i=0;i<mid;i++)b[i]=a[i<<1];
	for(int i=0;i<mid;i++)b[i|mid]=a[i<<1|1];
	ifft(b,mid),ifft(b+mid,mid);
	for(int i=0;i<mid;i++,x__=x__*x_)
	{
		C x(b[i+mid]*(C){x__.x,-x__.y});
		a[i]=b[i]+x,a[i+mid]=b[i]-x;
	}
}
void mm256_fft(mm256_C*a,int n,int fl)
{
	
}
C a[1<<21];
int main()
{
	for(int i=0;i<=20;i++)co[i]=cos(2*pi/(1<<i)),si[i]=sin(2*pi/(1<<i));
	read(n);read(m);++n,++m,N=min(1<<21,1<<(int)(log2(n+m)+1));
	for(int i=0;i<n;i++)read(a[i].x);
	for(int i=0;i<m;i++)read(a[i].y);
//	if(N<16)
//	{
		fft(a,N);
		for(int i=0;i<N;i++)a[i]=a[i]*a[i];
		ifft(a,N);
//	}
//	else
//	{
//		
//	}
	for(int i=0;i<n+m-1;i++){write((int)round(a[i].y/N/2));putc(32);}
	fwflush();
	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #136.87 us48 KBAcceptedScore: 0

Subtask #1 Testcase #2184.364 ms13 MB + 664 KBAcceptedScore: 0

Subtask #1 Testcase #385.296 ms6 MB + 516 KBAcceptedScore: 100

Subtask #1 Testcase #485.376 ms6 MB + 504 KBAcceptedScore: 0

Subtask #1 Testcase #538.45 us48 KBAcceptedScore: 0

Subtask #1 Testcase #637 us48 KBAcceptedScore: 0

Subtask #1 Testcase #736.34 us48 KBAcceptedScore: 0

Subtask #1 Testcase #8183.444 ms13 MB + 396 KBAcceptedScore: 0

Subtask #1 Testcase #9183.43 ms13 MB + 396 KBAcceptedScore: 0

Subtask #1 Testcase #10182.56 ms13 MB + 128 KBAcceptedScore: 0

Subtask #1 Testcase #11184.605 ms13 MB + 744 KBAcceptedScore: 0

Subtask #1 Testcase #12180.939 ms12 MB + 624 KBAcceptedScore: 0

Subtask #1 Testcase #1336.7 us48 KBAcceptedScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-03-20 10:42:22 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠