提交记录 28293


用户 题目 状态 得分 用时 内存 语言 代码长度
yzy4090 1002i. 【模板题】多项式乘法 Wrong Answer 0 54.9 ms 18624 KB C++14 5.70 KB
提交时间 评测时间
2025-06-16 21:07:08 2025-06-16 21:07:13
#include<bits/stdc++.h>
using namespace std;

namespace IO{
	#define BUF 512
	#define OBUF 2097152
	char buf[BUF],obuf[OBUF];
	char *p1 = buf, *p2 = buf, *p3 = obuf;
	inline int rd()
	{
	  int a = 0;
	  char c;
	  c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, BUF, stdin) , p1 == p2) ? (-1) : *p1++);
	  while(!isdigit(c)) {
	    c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, BUF, stdin) , p1 == p2) ? (-1) : *p1++);
	  }
	  while(isdigit(c)) {
	    a = (a << 3) + (a << 1) + (c ^ 48);
		c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, BUF, stdin) , p1 == p2) ? (-1) : *p1++);
	  }
	  return a;
	}
	int len;
	int c[30];
	inline void pt(int a)
	{
	  len = 0;
	  c[len++] = ' ';
	  if(a==0){
	  	c[len++] = 48;
	  }
	  while(a) {
	    c[len++] = (a % 10) + 48 , a = a / 10;
	  }
	  while(len--) {
	    p3 - obuf < OBUF ? *p3++ = c[len] : (fwrite(obuf, p3 - obuf, 1, stdout) ,p3 = obuf, *p3++ = c[len]);
	  }
	}
	inline void ptall(){
		fwrite(obuf, p3 - obuf, 1, stdout);
	}
}
using IO::rd;
using IO::pt;
using IO::ptall;

namespace polynomial{
	
	typedef long long ll;
	namespace Math{
		inline ll Pow(ll a,ll b,const ll& P){
			ll c=1;
			while(b){
				if(b&1)c=c*a%P;
				a=a*a%P,b>>=1;
			}
			return c;
		}
		inline ll Inv(ll a,const ll& P){return Pow(a,P-2,P);}
	}
	using namespace Math;
	
	const int MAXN=(1<<21)+5;
	
	int invd,ipd;
	ll inv[MAXN];
	
	void Initinv(const int& n,const int& P){
		if(invd==0)inv[1]=1,invd=1,ipd=P;
		if(invd>=n&&ipd==P)return;
		if(ipd!=P)invd=1;
		for(int i=invd+1;i<=n;i++)inv[i]=inv[P%i]*(P-P/i)%P;
		invd=n,ipd=P;
	}
	
	int revd;
	int rev[MAXN];
	void Initrev(const int& n){
		if(revd==n)return;
		revd=n;
		int p=__builtin_ctz(n)-1;
		for(int i=1;i<n;i++)rev[i]=((rev[i>>1]>>1)|((i&1)<<p));
	}
	
	int omed,opd;
	ll ome[MAXN];
	void Initome(const int& n,const int& P,const int& G){
		if(omed==n&&opd==P)return;
		ll om=Pow(G,(P-1)/__lg(n),P);
		ome[n>>1]=1;
		for(int i=(n>>1)+1;i<n;i++)ome[i]=ome[i-1]*om%P;
		for(int i=(n>>1)-1;i>0;i--)ome[i]=ome[i<<1];
	}
	
	inline void DFT(vector<ll>& a,const ll& P,const ll& G){
		if((int)a.size()==1)return;
		int n=a.size();
		Initinv(n,P),Initrev(n),Initome(n,P,G);
		for(int i=0;i<n;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
		for(int i=2,i2=1;i<=n;i2=i,i<<=1)
			for(int j=0;j<n;j+=i)
				for(int k=0;k<i2;k++){
					int y=a[i2|j|k]*ome[j|k]%P;
					a[i2|j|k]=(a[j|k]-y+P)%P,(a[j|k]+=y)%=P;
				}
	}
	
	inline void IDFT(vector<ll>& a,const ll& P,const ll& G){
		int n=a.size();
		reverse(a.begin()+1,a.end());
		DFT(a,P,G);
		int invn=Inv(n,P);
		for(int i=0;i<n;i++)a[i]=a[i]*invn%P;
	}
	
	template<const ll P=998244353,const ll G=3>
	struct Poly{
		
		static const ll inv2=(P+1)>>1;
		vector<ll>a;
		inline Poly& operator = (const Poly<P,G>& ano){return a=ano.a,*this;}
		
		inline unsigned size()const{return a.size();}
		inline Poly(){}
		inline Poly(int n){a.resize(n);}
		inline Poly(const vector<ll> b):a(b){}
		inline Poly(const Poly<P,G>& ano):a(ano.a){}
		
		inline ll& operator [](const int& i){return a[i];}
		
		Poly ModXn(const int& n)const{
			if((int)a.size()<=n)return *this;
			return Poly(vector<ll>{a.begin(),a.begin()+n});
		}
		
		Poly DivXn(const int& n)const{
			if((int)a.size()<=n)return Poly();
			return Poly(vector<ll>{a.begin()+n,a.end()});
		}
		
		Poly MulXn(const int& n)const{
			Poly b=*this;
			b.a.insert(b.a.begin(),n,0);
			return b;
		}
		
		Poly& operator += (const Poly& ano){
			if((int)a.size()<(int)ano.a.size())
				a.resize(ano.a.size());
			for(int i=0;i<(int)ano.a.size();i++){
				a[i]+=ano.a[i];
				if(a[i]>=P)a[i]-=P;
			}
			return *this;
		}
		Poly& operator -= (const Poly& ano){
			if((int)a.size()<(int)ano.a.size())
				a.resize(ano.a.size());
			for(int i=0;i<(int)ano.a.size();i++){
				a[i]-=ano.a[i];
				if(a[i]<0)a[i]+=P;
			}
			return *this;
		}
		Poly operator - (void)const{
			Poly c=*this;
			for(int i=0;i<(int)c.size();i++)if(c[i])c[i]=P-c[i];
			return c;
		}
		Poly Dif()const{
			Poly b(a.size()-1);
			for(int i=(int)a.size()-1;i>=1;i--)if(a[i])b[i-1]=a[i]*i%P;
			return b;
		}
		Poly Int()const{
			Poly b(a.size()+1);
			Initinv(a.size(),P);
			for(int i=(int)a.size()-1;i>=0;i--)if(a[i])b[i+1]=a[i]*inv[i+1]%P;
			return b;
		}
		Poly& operator *= (Poly ano){
			int n=size(),m=ano.size();
			if(n+m-1<=0)return *this=Poly<P,G>();
			if(m<=220){
				vector<ll>c(n+m-1);
				for(int i=0;i<n;i++)
					for(int j=0;j<m;j++)
						c[i+j]=(c[i+j]+a[i]*ano.a[j])%P;
				a=c;
				return *this;
			}
			int o=1<<__lg((n+m-1)*2-1);
			a.resize(o),ano.a.resize(o);
			DFT(a,P,G),DFT(ano.a,P,G);
			for(int i=0;i<o;i++)a[i]=a[i]*ano[i]%P;
			IDFT(a,P,G);
			return *this=ModXn(n+m-1);
		}
		
		Poly operator + (const Poly& ano)const{
			return Poly(*this)+=ano;
		}
		Poly operator - (const Poly& ano)const{
			return Poly(*this)-=ano;
		}
		Poly operator * (const Poly& ano)const{
			return Poly(*this)*=ano;
		}
		
		Poly Inv(const int& n)const{
			Poly c(vector<ll>{Math::Inv(a[0],P)});
			int l=1;
			while(l<n){
				l<<=1;
				c=(c*(Poly(vector<ll>{2})-c*ModXn(l)).ModXn(l)).ModXn(l);
			}
			return c.ModXn(n);
		}
		
		Poly Ln(const int& n)const{
			Poly now=(Dif()*Inv(n)).Int().ModXn(n);
			return now;
		}
		
		Poly Exp(const int& n)const{
			Poly c(vector<ll>{1});
			int l=1;
			while(l<n){
				l<<=1;
				Poly t=ModXn(l)-c.Ln(l);
				t.a[0]++;
				if(t.a[0]>=P)t.a[0]-=P;
				c=(t*c).ModXn(l);
			}
			return c.ModXn(n);
		}
		
		Poly Pow(const int& k,const int& n)const{
			Poly now=Ln(n);
			for(int i=0;i<n;i++)now.a[i]=now.a[i]*k%P;
			return now.Exp(n);
		}
		
	};
	typedef Poly<998244353,3> poly;
	
}
using namespace polynomial;

int main(){
	
	ios::sync_with_stdio(0),cin.tie(0);
	
	int n,m;n=rd()+1,m=rd()+1;
	poly a(n),b(m);
	for(int i=0;i<n;i++)a[i]=rd();
	for(int i=0;i<m;i++)b[i]=rd();
	a*=b;
	for(int i=0;i<n+m-1;i++)pt(a[i]);
	
	return ptall(),0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #148.09 us68 KBAcceptedScore: 100

Subtask #1 Testcase #254.793 ms18 MB + 192 KBWrong AnswerScore: -100

Subtask #1 Testcase #325.208 ms9 MB + 524 KBWrong AnswerScore: 0

Subtask #1 Testcase #41.74 ms2 MB + 904 KBAcceptedScore: 0

Subtask #1 Testcase #540.29 us68 KBAcceptedScore: 0

Subtask #1 Testcase #640.27 us68 KBAcceptedScore: 0

Subtask #1 Testcase #739.63 us68 KBAcceptedScore: 0

Subtask #1 Testcase #853.324 ms16 MB + 768 KBWrong AnswerScore: 0

Subtask #1 Testcase #953.244 ms16 MB + 496 KBWrong AnswerScore: 0

Subtask #1 Testcase #1051.89 ms15 MB + 44 KBWrong AnswerScore: 0

Subtask #1 Testcase #1154.9 ms18 MB + 192 KBWrong AnswerScore: 0

Subtask #1 Testcase #1248.495 ms15 MB + 184 KBAcceptedScore: 0

Subtask #1 Testcase #1339.88 us68 KBAcceptedScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2025-07-02 01:31:11 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠