除法&取模
设 次多项式 和 次多项式 ,求 次多项式 和 次多项式 满足
于是我们有
两遍同乘 :
对于 次多项式 , 代表的是多项式系数对称交换,设其为 ,则
由于 是 次多项式,于是式子满足
于是
多项式求逆即可
于是我们可以求出 ,根据定义求出 即可
代码
#include <bits/stdc++.h>
using namespace std;
const int N=6e5+5,P=998244353;
int n,m,f[N],g[N],G[2]={3,(P+1)/3},A[N],B[N],t,p,re[N],d[N],q[N];
int X(int x){return x>=P?x-P:x;}
int K(int x,int y){
int z=1;
for (;y;y>>=1,x=1ll*x*x%P)
if (y&1) z=1ll*z*x%P;
return z;
}
void put(int *a,int l){
for (int i=0;i<=l;i++)
printf("%d",a[i]),
putchar(i<l?' ':'\n');
}
void pre(int l){
for (t=1,p=0;t<l;t<<=1,p++);
for (int i=0;i<t;i++)
re[i]=(re[i>>1]>>1)|((i&1)<<(p-1));
}
void Ntt(int *a,int o){
for (int i=0;i<t;i++)
if (i<re[i]) swap(a[i],a[re[i]]);
for (int wn,i=1;i<t;i<<=1){
wn=K(G[o],(P-1)/(i<<1));
for (int x,y,j=0;j<t;j+=(i<<1))
for (int w=1,k=0;k<i;k++,w=1ll*w*wn%P)
x=a[j+k],y=1ll*w*a[i+j+k]%P,
a[j+k]=X(x+y),a[i+j+k]=X(x-y+P);
}
if (o)
for (int i=0,v=K(t,P-2);i<t;i++)
a[i]=1ll*a[i]*v%P;
}
void inv(int *a,int *b,int l){
if (l==1){
b[0]=K(a[0],P-2);
return;
}
inv(a,b,(l+1)>>1);
for (int i=0;i<l;i++)
A[i]=a[i],B[i]=b[i];
pre(l<<1);Ntt(A,0);Ntt(B,0);
for (int i=0;i<t;i++)
A[i]=1ll*A[i]*B[i]%P*B[i]%P;
Ntt(A,1);
for (int i=0;i<l;i++)
b[i]=X(X(b[i]<<1)+P-A[i]);
for (int i=0;i<t;i++) A[i]=B[i]=0;
}
void dvs(int *f,int *g,int *q,int *d){
reverse(f,f+n+1);reverse(g,g+m+1);
inv(g,q,n-m+1);
for (int i=0;i<=n-m;i++)
A[i]=q[i],B[i]=f[i];
pre((n-m+1)<<1);Ntt(A,0);Ntt(B,0);
for (int i=0;i<t;i++)
A[i]=1ll*A[i]*B[i]%P;
Ntt(A,1);
for (int i=0;i<=n-m;i++) q[i]=A[i];
for (int i=0;i<t;i++) A[i]=B[i]=0;
reverse(q,q+n-m+1);
reverse(f,f+n+1);reverse(g,g+m+1);
for (int i=0;i<=m;i++) A[i]=g[i];
for (int i=0;i<=n-m;i++) B[i]=q[i];
pre(n+2);Ntt(A,0);Ntt(B,0);
for (int i=0;i<t;i++)
A[i]=1ll*A[i]*B[i]%P;
Ntt(A,1);
for (int i=0;i<m;i++)
d[i]=X(f[i]-A[i]+P);
for (int i=0;i<t;i++) A[i]=B[i]=0;
}
int main(){
cin>>n>>m;
for (int i=0;i<=n;i++)
scanf("%d",&f[i]);
for (int i=0;i<=m;i++)
scanf("%d",&g[i]);
dvs(f,g,q,d);
put(q,n-m);put(d,m-1);
return 0;
}
来源:CSDN
作者:Johnny817
链接:https://blog.csdn.net/Johnny817/article/details/104110755