提交记录 8957


用户 题目 状态 得分 用时 内存 语言 代码长度
wangtian1213 1002i. 【模板题】多项式乘法 Accepted 100 91.626 ms 236980 KB C++11 2.19 KB
提交时间 评测时间
2019-03-26 19:21:28 2020-08-01 01:27:43
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=5e6+5;

//¸´ÊýÀàÐÍ 
const double Pi=acos(-1.0);    //¦ÐµÄÖµ
struct complex {  //¸´ÊýÀàÐÍ 
	double x,y;   //xΪ³£Êý£¬yΪsqrt(-1)µÄϵÊý 
	complex (double xx=0,double yy=0) { x=xx,y=yy; }
} A[N],B[N],Omega[N];
complex operator + (complex a,complex b) { return complex(a.x+b.x,a.y+b.y); }  //¸´Êý¼Ó·¨ 
complex operator - (complex a,complex b) { return complex(a.x-b.x,a.y-b.y); }  //¸´Êý¼õ·¨
complex operator * (complex a,complex b) { return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x); }  //¸´Êý³Ë·¨  
int len,n,m,r[N],l; 
inline complex Conj(complex z) { return complex(z.x,-z.y); }

//FFT µãÖµ±íʾ·¨ÓëϵÊý±íʾ·¨µÄ»¥»» 
void FFT(complex *A,bool P) {  //AΪϵÊý£¬PµÄ½âÊͼûÏÂÃæ
	for (int i=0; i<len; i++)
		if (i<r[i]) swap(A[i],A[r[i]]);  //Çó³öµü´úµÄÐòÁÐ
	for (int mid=1; mid<len; mid<<=1) {  //Õâ´ÎÒªºÏ²¢µÄÇø¼äµÄ³¤¶ÈµÄÒ»°ë
		complex Wn=P?Conj(Omega[len/mid>>1]):Omega[len/mid>>1];  //ÓÃÅ·À­¶¨ÀíÇóµ¥Î»¸ù		 
		for (int j=0; j<len; j+=(mid<<1)) { //(mid<<1)ÎªÇø¼ä³¤¶È£¬jΪµ±Ç°Î»ÖÃ
			complex w=complex(1,0);  //0´Î·½ÃÝ
			for (int k=0; k<mid; k++,w=w*Wn) { //ö¾Ù×ó°ë²¿·ÖµÄÇø¼ä
				complex x=A[j+k],y=w*A[j+mid+k];  //ÓúûµûЧӦ·ÖÆæÅ¼Ëã¶àÏîʽ
				A[j+k]=x+y; 
				A[j+mid+k]=x-y;     //×ó±ßµÄ´ð°¸ÓëÓұߵĴð°¸Ö»ÓÐϵÊý²»Í¬
			}
		}
	}
}		 

int main() {
	scanf("%d%d",&n,&m);
	for (int i=0; i<=n; i++) scanf("%lf",&A[i].x); //´ú±íAÖÐx^0,x^1,x^2¡­¡­µÄϵÊý 
	for (int i=0; i<=m; i++) scanf("%lf",&B[i].x); //ºÍAÒâÒåÏàËÆ
	len=1; while (len<=n+m) len<<=1,l++;          //lenΪµ¥Î»wµÄ×î´óÃݴη½
	for (int i=0; i<len; i++)
		r[i]=(r[i>>1]>>1)|((i&1)<<(l-1)); 
	Omega[0]=complex(1,0), 
	Omega[1]=complex(cos(2*Pi/len),sin(2*Pi/len));
	for (int i=2; i<len; i++)
		Omega[i]=Omega[i-1]*Omega[1]; //printf("%.2lf %.2lf\n",Omega[2].x,Omega[2].y);
	//ºûµû¶¨Àí
	// ÔÚÔ­ÐòÁÐÖÐ i Óë i/2 µÄ¹ØÏµÊÇ £º i¿ÉÒÔ¿´×öÊÇi/2µÄ¶þ½øÖÆÉϵÄÿһλ×óÒÆÒ»Î»µÃÀ´
    // ÄÇôÔÚ·´×ªºóµÄÊý×éÖоÍÐèÒªÓÒÒÆÒ»Î»£¬Í¬Ê±ÌØÊâ´¦ÀíÒ»ÏÂÆæÊý  
    
	FFT(A,0); FFT(B,0);     //1±íʾ´ÓϵÊý->µãÖµ,-1±íʾ´ÓµãÖµ->ϵÊý   
	for (int i=0; i<=len; i++) A[i]=A[i]*B[i]; //ÏòÁ¿³Ë·¨
	FFT(A,1);    
	for (int i=0; i<=n+m; i++)   
		printf("%d ",(int)(A[i].x/len+0.5));   //ËÄÉáÎåÈ룬ÕâÀï³ýÒÔlenÊÇÒòΪ¹«Ê½£¨¼û¸½±¾£©
	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #125.66 ms228 MB + 952 KBAcceptedScore: 0

Subtask #1 Testcase #291.362 ms231 MB + 356 KBAcceptedScore: 0

Subtask #1 Testcase #356.869 ms229 MB + 720 KBAcceptedScore: 100

Subtask #1 Testcase #456.889 ms229 MB + 708 KBAcceptedScore: 0

Subtask #1 Testcase #526.009 ms228 MB + 952 KBAcceptedScore: 0

Subtask #1 Testcase #625.808 ms228 MB + 952 KBAcceptedScore: 0

Subtask #1 Testcase #726.561 ms228 MB + 952 KBAcceptedScore: 0

Subtask #1 Testcase #885.764 ms231 MB + 88 KBAcceptedScore: 0

Subtask #1 Testcase #985.137 ms231 MB + 88 KBAcceptedScore: 0

Subtask #1 Testcase #1078.995 ms230 MB + 844 KBAcceptedScore: 0

Subtask #1 Testcase #1191.626 ms231 MB + 436 KBAcceptedScore: 0

Subtask #1 Testcase #1291.574 ms230 MB + 316 KBAcceptedScore: 0

Subtask #1 Testcase #1326.078 ms228 MB + 952 KBAcceptedScore: 0


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