WA 60pts求助
查看原帖
WA 60pts求助
244165
_121017_楼主2022/6/26 10:48

商是对的,余数从莫名其妙的地方开始错

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
const int w0=3;
const int inv=332748118;
const int N=3e6+5;
int n,m,l,limit=1;
int rev[N];
int a[N],b[N],c[N],d[N],q[N],y[N];
int qpow(int n,int m){
	int ret=1;
	while(m){
		if(m&1) ret=ret*n%mod;
		n=n*n%mod;
		m>>=1;
	}
	return ret;
}
void NTT(int *A,int type){
	for(int i=0;i<limit;i++)
		if(i<rev[i]) swap(A[i],A[rev[i]]);
	for(int mid=1;mid<limit;mid<<=1){
		int wn=qpow(type==1?w0:inv,(mod-1)/(mid<<1));
		for(int j=0,r=mid<<1;j<limit;j+=r){
			int w=1;
			for(int k=0;k<mid;k++,w=w*wn%mod){
				int x=A[j+k],y=w*A[j+mid+k]%mod;
				A[j+k]=(x+y)%mod;
				A[j+mid+k]=(x-y+mod)%mod;
			}
		}
	}
	if(type==1) return ;
	int inv=qpow(limit,mod-2);
	for(int i=0;i<limit;i++)
		A[i]=A[i]*inv%mod;
}
void ni(int len,int *a,int *b){
	if(len==1){
		b[0]=qpow(a[0],mod-2);
		return ;
	}
	ni((len+1)>>1,a,b);
	l=0,limit=1;
	while(limit<=(len<<1)) l++,limit<<=1;
	for(int i=0;i<limit;i++)
		rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
	for(int i=0;i<len;i++) c[i]=a[i];
	for(int i=len;i<limit;i++) c[i]=0;
	NTT(c,1),NTT(b,1);
	for(int i=0;i<limit;i++)
		b[i]=(2-b[i]*c[i]%mod+mod)%mod*b[i]%mod;
	NTT(b,-1);
	for(int i=len;i<limit;i++) b[i]=0;
}
void div(int *A,int *B,int *C){
	reverse(A,A+n+1),reverse(B,B+m+1);
	ni(n-m+1,B,b);
	l=0,limit=1;
	while(limit<=(n<<2)) l++,limit<<=1;
	for(int i=0;i<limit;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1)),d[i]=A[i]; 
	NTT(A,1),NTT(b,1);
	for(int i=0;i<limit;i++) A[i]=A[i]*b[i]%mod;
	NTT(A,-1);
	reverse(A,A+n-m+1),reverse(B,B+m+1),reverse(d,d+n+1);
	NTT(A,1),NTT(B,1);
	for(int i=0;i<limit;i++) B[i]=B[i]*A[i]%mod;
	NTT(A,-1),NTT(B,-1);
	for(int i=0;i<limit;i++) C[i]=(d[i]-B[i]+mod)%mod;
}
signed main(){
	freopen("P4512_4.in","r",stdin);
//	freopen("P4512.out","w",stdout);
	cin>>n>>m;
	for(int i=0;i<=n;i++) scanf("%lld",&q[i]);
	for(int i=0;i<=m;i++) scanf("%lld",&a[i]);
	div(q,a,y);
	for(int i=0;i<=n-m;i++) printf("%lld ",q[i]);
	cout<<endl;
	for(int i=0;i<m;i++) printf("%lld ",y[i]);
	return 0;
}
2022/6/26 10:48
加载中...