提交记录 28470


用户 题目 状态 得分 用时 内存 语言 代码长度
Dreamer_OI 1002i. 【模板题】多项式乘法 Accepted 100 115.302 ms 5676 KB C++ 2.11 KB
提交时间 评测时间
2025-09-14 22:36:14 2025-09-14 22:36:19
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double pi=acos(-1);
int n,m,len=1,deg=0;
struct Complex{
	double real,imag;
}f[3000010],buf1,buf2;
Complex operator ~(const Complex &x){
	return (Complex){x.real,-x.imag};
}
Complex operator -(const Complex &x){
	return (Complex){-x.real,-x.imag}; 
}
Complex operator +(const Complex &x,const Complex &y){
	return (Complex){x.real+y.real,x.imag+y.imag};
}
Complex operator -(const Complex &x,const Complex &y){
	return (Complex){x.real-y.real,x.imag-y.imag};
}
Complex operator *(const Complex &x,const Complex &y){
	return (Complex){x.real*y.real-x.imag*y.imag,x.real*y.imag+x.imag*y.real};
}
Complex operator /(const Complex &x,const Complex &y){
	return (Complex){(x.real*y.real+x.imag*y.imag)/(y.real*y.real+y.imag*y.imag),(x.imag*y.real-x.real*y.imag)/(y.real*y.real+y.imag*y.imag)}; 
}
int main(){
	scanf("%d %d",&n,&m);
	for(int i=0;i<=n;i++){
		scanf("%lf",&f[i].real); 
	}
	for(int i=0;i<=m;i++){
		scanf("%lf",&f[i].imag);
	}
	while(len<=n+m){
		len*=2;
		deg++;
	}
	for(int i=0;i<len;i++){
		int rev=0; 
		for(int j=0;j<deg;j++){
			if(i&(1<<j)){
				rev+=1<<(deg-1-j);
			}
		}
		if(i<rev){
			swap(f[i],f[rev]);
		}
	}
	for(int i=0;i<deg;i++){
		for(int l1=0;l1<len;l1+=1<<(i+1)){
			Complex omega=(Complex){cos(pi/(1<<i)),sin(pi/(1<<i))},pre=(Complex{1,0}); 
			int l2=l1+(1<<i);
			for(int j=0;j<(1<<i);j++){
				buf1=f[l1+j]+(~pre)*f[l2+j];
				buf2=f[l1+j]+(~(-pre))*f[l2+j];
				f[l1+j]=buf1;
				f[l2+j]=buf2;
				pre=pre*omega; 
			}
		}
	}
	for(int i=0;i<len;i++){
		f[i]=f[i]*f[i];
	}
	for(int i=0;i<len;i++){
		int rev=0; 
		for(int j=0;j<deg;j++){
			if(i&(1<<j)){
				rev+=1<<(deg-1-j);
			}
		}
		if(i<rev){
			swap(f[i],f[rev]);
		}
	}
	for(int i=0;i<deg;i++){
		for(int l1=0;l1<len;l1+=1<<(i+1)){
			Complex omega=(Complex){cos(pi/(1<<i)),-sin(pi/(1<<i))},pre=(Complex{1,0}); 
			int l2=l1+(1<<i);
			for(int j=0;j<(1<<i);j++){
				buf1=f[l1+j]+(~pre)*f[l2+j];
				buf2=f[l1+j]+(~(-pre))*f[l2+j];
				f[l1+j]=buf1;
				f[l2+j]=buf2;
				pre=pre*omega; 
			}
		}
	}
	for(int i=0;i<=n+m;i++){
		printf("%lld ",(long long)(f[i].imag/len/2+0.5));
	}
	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #146.1 us48 KBAcceptedScore: 100

Subtask #1 Testcase #2114.928 ms5 MB + 476 KBAcceptedScore: 0

Subtask #1 Testcase #353.898 ms2 MB + 328 KBAcceptedScore: 0

Subtask #1 Testcase #453.829 ms2 MB + 316 KBAcceptedScore: 0

Subtask #1 Testcase #539.54 us48 KBAcceptedScore: 0

Subtask #1 Testcase #637.6 us48 KBAcceptedScore: 0

Subtask #1 Testcase #738.08 us48 KBAcceptedScore: 0

Subtask #1 Testcase #8108.562 ms5 MB + 208 KBAcceptedScore: 0

Subtask #1 Testcase #9108.54 ms5 MB + 208 KBAcceptedScore: 0

Subtask #1 Testcase #10102.27 ms4 MB + 964 KBAcceptedScore: 0

Subtask #1 Testcase #11115.302 ms5 MB + 556 KBAcceptedScore: 0

Subtask #1 Testcase #12115.099 ms4 MB + 436 KBAcceptedScore: 0

Subtask #1 Testcase #1337.24 us48 KBAcceptedScore: 0


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