提交记录 15206


用户 题目 状态 得分 用时 内存 语言 代码长度
asd_a 1002i. 【模板题】多项式乘法 Accepted 100 82.173 ms 8548 KB C++ 2.69 KB
提交时间 评测时间
2020-12-14 11:11:57 2020-12-14 11:12:01
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
inline int fp(int x,int y){
	int ans=1;for(;y;y>>=1,x=1ll*x*x%mod)
		if(y&1)ans=1ll*ans*x%mod;
	return ans;
}
namespace Poly{
	const int N=1<<21|5;
	const int gen=3,ivg=332748118;
	int A[N],B[N],rev[N];
	struct lsp{
		int pw1[1<<15|5],pw2[1<<15|5],block;
		lsp(int x=0){
			pw1[0]=pw2[0]=1;block=1<<15;
			for(int i=1;i<=block;i++)
				pw1[i]=1ll*pw1[i-1]*x%mod;
			for(int i=1;i*block<=mod;i++)
				pw2[i]=1ll*pw2[i-1]*pw1[block]%mod;
		}inline int operator [](int x){
			if(x<0)x+=mod-1;
			return 1ll*pw1[x&32767]*pw2[x>>15]%mod;
		}
	}pw[2]={ivg,gen};
	inline void ntt(int *a,int lim,int fl=1){
		for(int i=0;i<lim;i++){
			rev[i]=(rev[i>>1]>>1)|((i&1)*(lim>>1));
			if(i<rev[i])swap(a[i],a[rev[i]]);
		}for(int k=1;k<lim;k<<=1){
			for(int j=0;j<lim;j+=(k<<1))
				for(int i=j;i<j+k;i++){
					int t=1ll*pw[fl][mod/(k<<1)*(i-j)]*a[i+k]%mod;
					a[i+k]=(a[i]+mod-t)%mod;
					a[i]=(a[i]+t)%mod;
				}
		}if(!fl)for(int i=0,ivlim=fp(lim,mod-2);i<lim;i++)a[i]=1ll*a[i]*ivlim%mod;
	}
	inline void clra(int *a,int x){fill(a,a+x,0);}
	struct poly{
		vector<int>f;
		int n;
		poly(int x=0){
			f.clear();n=0;
			if(x)f.push_back(x),++n;
		}
		poly(int *a,int x){
			n=x;f.clear();
			for(int i=0;i<n;i++)
				f.push_back(a[i]);
		}
		poly(vector<int>& a,int x){
			n=x;f.clear();
			for(int i=0;i<n;i++)
				f.push_back(a[i]);
		}
		int& operator [](int x){return f[x];}
		const int operator [](int x)const{return f[x];}
		inline int size(){return n;}
		inline void resize(int x){f.resize(n=x);}
		inline poly getp(int x){
			for(int i=0;i<n&&i<x;i++)A[i]=f[i];poly a=poly(A,x);clra(A,x);return a;
		}
		inline void getarry(int *a){
			for(int i=0;i<n;i++)a[i]=f[i];
		}
		inline poly operator *(poly a){
			getarry(A);a.getarry(B);int lim=1;
			while(lim<n+a.n)lim<<=1;ntt(A,lim);ntt(B,lim);
			for(int i=0;i<lim;i++)A[i]=1ll*A[i]*B[i]%mod;
			ntt(A,lim,0);poly b=poly(A,n+a.n-1);
			clra(A,lim);clra(B,lim);return b;
		}inline poly operator +(poly a){
			getarry(A);a.getarry(B);int lim=max(n,a.n);
			for(int i=0;i<lim;i++)A[i]=(A[i]+B[i])%mod;
			poly b=poly(A,lim);return b;
		}inline poly operator -(poly a){
			getarry(A);a.getarry(B);int lim=max(n,a.n);
			for(int i=0;i<lim;i++)A[i]=(A[i]+mod-B[i])%mod;
			poly b=poly(A,lim);return b;
		}
		inline poly inv(){
			poly a(fp(f[0],mod-2));
			for(int i=1;i<n;i<<=1){
				poly b=a*a;
				b=b*getp(i<<1);
				a=a+a-b.getp(i<<1);
			}
			return a.getp(n);
		}
	};
}
using Poly::poly;
const int N=1e6+5;
int f[N],g[N],n,m;
poly h;
int main(){
	scanf("%d%d",&n,&m);++n;++m;
	for(int i=0;i<n;i++)scanf("%d",f+i);
	for(int i=0;i<m;i++)scanf("%d",g+i);
	h=poly(f,n)*poly(g,m);
	for(int i=0;i<h.n;i++)printf("%d ",h[i]);
	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #1535.88 us560 KBAcceptedScore: 0

Subtask #1 Testcase #281.676 ms8 MB + 276 KBAcceptedScore: 100

Subtask #1 Testcase #337.865 ms3 MB + 856 KBAcceptedScore: 0

Subtask #1 Testcase #438.08 ms3 MB + 988 KBAcceptedScore: 0

Subtask #1 Testcase #5538.08 us560 KBAcceptedScore: 0

Subtask #1 Testcase #6537.04 us560 KBAcceptedScore: 0

Subtask #1 Testcase #7534.94 us560 KBAcceptedScore: 0

Subtask #1 Testcase #875.798 ms7 MB + 624 KBAcceptedScore: 0

Subtask #1 Testcase #975.692 ms7 MB + 628 KBAcceptedScore: 0

Subtask #1 Testcase #1069.953 ms6 MB + 976 KBAcceptedScore: 0

Subtask #1 Testcase #1181.76 ms8 MB + 356 KBAcceptedScore: 0

Subtask #1 Testcase #1282.173 ms7 MB + 236 KBAcceptedScore: 0

Subtask #1 Testcase #13535.21 us560 KBAcceptedScore: 0


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