80pts 求调
查看原帖
80pts 求调
553501
可爱的小棉羊楼主2024/5/5 16:09

WA on (#7 #8)

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,g=3,ing=(1+mod)/g;
long long fpow(long long a,long long b){
	long long ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
long long a[800005],b[800005];
long long  rev[800005],n,m,inv[2][800005];
void calcrev(int len,int k){
	for(int i=1;i<len;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
}
void ntt(long long *a,int n,int f){
	for(int i=0;i<n;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
	for(int h=1;h<n;h<<=1){
		long long wn=fpow((f==1)? g:ing,(mod-1)/(h<<1));
		for(int i=0;i<n;i+=(h<<1)){
			long long w=1;
			for(int j=0;j<h;j++,w=(w*wn)%mod){
				long long x=a[i+j],y=w*a[i+j+h]%mod;
				a[i+j]=(x+y)%mod;
				a[i+j+h]=(x-y+mod)%mod;
			}
		}
	}
	if(f==-1){
		long long inv=fpow(n,mod-2);
		for(int i=0;i<n;i++)a[i]=a[i]*inv%mod;
	}
}
long long tmp1[800005],tmp2[800005];
void mul(long long *a,long long *b,int n){
	memset(tmp1,0,sizeof(tmp1));
	memset(tmp2,0,sizeof(tmp2));
	for(int i=0;i<(n>>1);i++){
		tmp1[i]=a[i];
		tmp2[i]=b[i];
	}
	ntt(tmp1,n,1);
	ntt(tmp2,n,1);
	for(int i=0;i<n;i++)tmp1[i]=tmp1[i]*tmp2[i]%mod;
	ntt(tmp1,n,-1);
	for(int i=0;i<n;i++)a[i]=tmp1[i];
}
bool t;
long long q[800005],G[800005],F[800005];
int main(){
	cin>>n>>m;
	for(int i=0;i<=n;i++){cin>>a[i];F[i]=a[i];}
	for(int i=0;i<=m;i++){cin>>b[i];G[i]=b[i];}
	for(int i=0;i<(n+1)>>1;i++)swap(a[i],a[n-i]);
	for(int i=0;i<(m+1)>>1;i++)swap(b[i],b[m-i]);
//	for(int i=0;i<=m;i++)cout<<b[i]<<" ";
//	cout<<endl;
//	cout<<b[0]<<endl;
	inv[0][0]=fpow(b[0],mod-2);
	int len=n-m;
//	len--
	int bas=1,k=1,lim=2;
	calcrev(lim,k);
	while(bas<=(len<<1)){
		memset(inv[t^1],0,sizeof(inv[t^1]));
		for(int i=0;i<bas;i++)inv[t^1][i]=(inv[t][i]<<1)%mod;
		mul(inv[t],inv[t],lim);
		mul(inv[t],b,lim);
		for(int i=0;i<bas;i++)inv[t^1][i]=(inv[t^1][i]-inv[t][i]+mod)%mod;
		t^=1;
		for(int i=bas;i<(bas<<1);i++)inv[t][i]=0;
		bas<<=1;
		lim<<=1;
		k++;
//		for(int i=0;i<bas;i++)cout<<inv[t][i]<<" ";
//		cout<<endl;
		
		if(bas<=(len<<1))calcrev(lim,k);
	}
//	for(int i=0;i<n;i++)
	for(int i=0;i<=len;i++)q[i]=inv[t][i];
	lim=2;
	k=1;
	while(lim<=(n+len)){
		k++;
		lim<<=1;
	}
	calcrev(lim,k);
	for(int i=len+1;i<n;i++)a[i]=0;
	mul(q,a,lim);
	//0~len
	for(int i=0;i<(len+1)>>1;i++)swap(q[i],q[len-i]);
	for(int i=0;i<=len;i++)cout<<q[i]<<" ";
	for(int i=len+1;i<n+m;i++)q[i]=0;
	mul(q,G,lim);
	cout<<endl;
	for(int i=0;i<m;i++){
		cout<<(F[i]%mod-q[i]%mod+mod)%mod<<" ";
	}
}
2024/5/5 16:09
加载中...