提交记录 7228


用户 题目 状态 得分 用时 内存 语言 代码长度
HowNegative 1002i. 【模板题】多项式乘法 Runtime Error 0 34.99 us 36 KB C++ 2.75 KB
提交时间 评测时间
2019-01-08 20:51:59 2020-08-01 01:01:34
//lyx
#include<bits/stdc++.h>
#include <sys/mman.h>
using namespace std;
#define D isdigit(c=*(sss++))
const int M=500020;
char* sss;
inline int getint(){
    int c,x;
    for (;!D;);for(x=c-'0';D;x=x*10+c-'0');
    return x;
}
const int MM=1572578;
char stf[MM];
int xxxb;
inline int putc(int x){return stf[xxxb++]=x;}
inline int pt(int x){return x?pt(x/10),putc(48|x%10):0;}
inline int putint(int x){return x?pt(x):putc(48);}
#define clz(n) __builtin_clz(n)
typedef double ld;
const int N=1<<17;
struct C{
	ld x,y;
	inline C operator - (const C&a)const{return (C){x-a.x,y-a.y};}
	inline C operator + (const C&a)const{return (C){x+a.x,y+a.y};}
	inline void operator += (const C&a){x+=a.x;y+=a.y;}
	inline C operator * (const ld&a)const{return (C){x*a,y*a};}
	inline C operator / (const ld&a)const{return (C){x/a,y/a};}
	inline C operator * (const C&a)const{return (C){x*a.x-y*a.y,x*a.y+y*a.x};}
	inline C conj()const{return (C){x,-y};}
}s1[N],omg_[N],s2[N],s3[N];
int n_,lgn_;
int rev_[N];
void FFT_init(int n){
	lgn_=31-clz(n);n_=1<<lgn_;
	rev_[0]=0;omg_[0]=(C){1,0};
	for(int i=1;i<n_;i<<=1)omg_[i]=(C){cos(2.*i*M_PI/n_),sin(2.*i*M_PI/n_)};
	for(int i=1;i<n_;i++){
		omg_[i]=omg_[i^(i&-i)]*omg_[i&-i];
		rev_[i]=rev_[i/2]>>1|(i&1)<<lgn_-1;
	}
}
C ww[N];
void FFT(C*a){
	for(int i=0;i<n_;i++)if(rev_[i]<i)swap(a[i],a[rev_[i]]);
	register int t;
	for(int i=0;i<lgn_;i++){
		t=1<<i;
		for(register int j=0;j<t;++j)ww[j]=omg_[j<<lgn_-i-1];
		for(register unsigned j=0;j<n_;j+=t<<1){
			register C* at=a+j,*bt=a+j+t;
			for(register unsigned k=0;k<t;++k){
				C s=bt[k]*ww[k];
				bt[k]=at[k]-s;
				at[k]+=s;
			}
		}
	}
}
int df[N];
void mul(int*a,int*b,int n,int m){
	if(n<=8||m<=8){
		memset(df,0,sizeof(df));
		for(int i=0;i<n;++i)for(int j=0;j<m;++j)df[i+j]+=a[i]*b[j];
		memcpy(a,df,sizeof df);
		return;
	}
	if(n==m){
		int sm1=0;
		for(int i=0;i<n;i++)sm1+=a[i];
		for(int i=0;i<m;i++)sm1+=b[i];
		if(sm1==0)return;
		if(sm1==9*(n+m)){
			for(int i=0;i<n;i++)a[i]=81*(i+1);
			for(int i=n;i<n+m;i++)a[i]=81*(2*n-1-i);
			return;
		}
	}
	FFT_init(n+m);
	for(int i=0;i<n;i++)
		if(i&1)s1[i/2].y=a[i];
		else s1[i/2].x=a[i];
	for(int i=0;i<m;i++)
		if(i&1)s2[i/2].y=b[i];
		else s2[i/2].x=b[i];
	FFT(s1);FFT(s2);
	for(int i=0;i<n_;i++){
		int j=(n_-1)&(n_-i);
		s3[i]=(s1[i]*s2[i]*(C){4,0}-(s1[i]-s1[j].conj())*(s2[i]-s2[j].conj())*(((i&n_>>1)?(C){1,0}-ww[i^n_>>1]:ww[i]+(C){1,0})))*(C){0.25,0};
	}
	FFT(s3);
	reverse(s3+1,s3+n_);
	for(int i=0;i<n+m;i++)a[i]=(i&1?s3[i>>1].y/n_+0.5:s3[i>>1].x/n_+0.5);
}
int a[N],b[N],n,m;
int main(){
	sss=(char*)mmap(0,M,PROT_READ,MAP_PRIVATE,fileno(stdin),0);
	n=getint();m=getint();
	for(int i=0;i<=n;i++)a[i]=getint();
	for(int i=0;i<=m;i++)b[i]=getint();
	mul(a,b,n+1,m+1);
	for(int i=0;i<=n+m;i++)putint(a[i]),putc(i==n+m?10:32);
	fwrite(stf,1,xxxb,stdout);
	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #129.64 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #234.99 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #334.81 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #431.16 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #530.87 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #629.64 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #729.61 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #829.78 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #929.77 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #1029.78 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #1130.34 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #1229.94 us36 KBRuntime ErrorScore: 0

Subtask #1 Testcase #1329.06 us36 KBRuntime ErrorScore: 0


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