求助!!!样例没过!!!搞了一晚上了
查看原帖
求助!!!样例没过!!!搞了一晚上了
472950
封禁用户楼主2022/5/25 22:55
#include<bits/stdc++.h>
#define int long long
#define N 300005

using namespace std;

int p=998244353,n,w[N],s[N],ans,a[25][N],sz;

int KSM(int a,int b){
	int t=1;
	while(b){
	    if(b&1)t=(t*a)%p;
	    b>>=1;
	    a=(a*a)%p;
	}
	return t;
}

void NTT(int n,int*a,int opt){
	int i,j=0,k;
	for(i=0;i<n;i++){
		if(i>j)swap(a[i],a[j]);
		for(int l=n>>1;(j^=l)<l;l>>=1);
	}
	for(i=1;i<n;i<<=1){
		int wn=KSM(3,(p-1)/(i<<1)),m=i<<1;
		for(j=0;j<n;j+=m){
			int w=1;
			for(k=0;k<i;k++,w=(w*wn)%p){
				int z=(a[j+i+k]*w)%p;
				a[i+j+k]=(a[j+k]-z+p)%p;
				a[j+k]=(a[j+k]+z)%p;
			}
		}
	}
	if(opt==-1)reverse(a+1,a+n);
}

int HMBB(int*a,int*b,int fn){
	NTT(fn,a,1);NTT(fn,b,1);
	for (int i=0;i<fn;i++)a[i]=(a[i]*b[i])%p;
	NTT(fn,a,-1);
}

void kdo(int ll,int rr){
	if(ll==rr){
		a[sz][0]=1;a[sz][w[ll]]=-1;sz++;
		return;
	}
	int mid=(ll+rr)/2,fn=1;
	kdo(ll,mid);kdo(mid+1,rr);
	while(fn<=s[rr]-s[ll-1])fn<<=1;
	HMBB(a[sz-2],a[sz-1],fn);
	int ss=0;do{a[sz-1][ss]=0;ss++;}while(a[sz-1][ss]!=-1);
	sz--;
}

signed main(){
	scanf("%lld",&n);
	for (int i=1;i<=n;i++){
		scanf("%lld",&w[i]);
		s[i]=s[i-1]+w[i];
	}
	kdo(2,n);
	for(int o=0;o<=s[n]-s[1];o++){
		ans+=KSM(w[1]+o,p-2)*a[0][o]%p;
		ans%=p;
	}
	cout<<ans*w[1]%p;
	return 0;
}
2022/5/25 22:55
加载中...