#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;
}
Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
Subtask #1 Testcase #1 | 48.09 us | 68 KB | Accepted | Score: 100 | 显示更多 |
Subtask #1 Testcase #2 | 54.793 ms | 18 MB + 192 KB | Wrong Answer | Score: -100 | 显示更多 |
Subtask #1 Testcase #3 | 25.208 ms | 9 MB + 524 KB | Wrong Answer | Score: 0 | 显示更多 |
Subtask #1 Testcase #4 | 1.74 ms | 2 MB + 904 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #5 | 40.29 us | 68 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #6 | 40.27 us | 68 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #7 | 39.63 us | 68 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #8 | 53.324 ms | 16 MB + 768 KB | Wrong Answer | Score: 0 | 显示更多 |
Subtask #1 Testcase #9 | 53.244 ms | 16 MB + 496 KB | Wrong Answer | Score: 0 | 显示更多 |
Subtask #1 Testcase #10 | 51.89 ms | 15 MB + 44 KB | Wrong Answer | Score: 0 | 显示更多 |
Subtask #1 Testcase #11 | 54.9 ms | 18 MB + 192 KB | Wrong Answer | Score: 0 | 显示更多 |
Subtask #1 Testcase #12 | 48.495 ms | 15 MB + 184 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #13 | 39.88 us | 68 KB | Accepted | Score: 0 | 显示更多 |