求助入门多项式题
查看原帖
求助入门多项式题
200044
JS_TZ_ZHR楼主2022/7/2 13:06

我知道数组开小了但是WA on4,观察这组数据可以发现数组爆不掉

#include<bits/stdc++.h>
#define N 1000005
#define int long long
#define mod 998244353
using namespace std;
int n,q,x,fac[N];
struct node{
	int len,x[N];
}f,tmp,res;
int fpow(int x,int y){
	int res=1;
	while(y){
		if(y&1)res=(res*x)%mod;
		x=(x*x)%mod;
		y>>=1;
	}
	return res;
}
void Mul(node &u,node v){
	res.len=u.len+v.len;
	for(int i=0;i<=res.len;i++)res.x[i]=0;
	for(int i=0;i<=u.len;i++)
		for(int j=0;j<=v.len;j++)
			res.x[i+j]=(res.x[i+j]+u.x[i]*v.x[j])%mod;
	u.len=res.len;
	for(int i=0;i<=res.len;i++)u.x[i]=res.x[i];
}
void Del(node &u,node v){
	res.len=u.len;
	for(int i=0;i<=u.len;i++)res.x[i]=(u.x[i]-v.x[i]+mod)%mod;
	u.len=res.len;
	for(int i=0;i<=res.len;i++)u.x[i]=res.x[i];
}
void query(node &u,node v){
	res.len=u.len-v.len;
	for(int i=u.len;i>=v.len;i--){
		int tmp=(u.x[i]*fpow(v.x[v.len],mod-2))%mod;
		res.x[i-v.len]=tmp;
		for(int j=v.len;j>=0;j--){
			u.x[i+j-v.len]-=v.x[j]*tmp;
			u.x[i+j-v.len]%=mod;
			u.x[i+j-v.len]=(u.x[i+j-v.len]+mod)%mod;
		}
	}
	u.len=res.len;
	for(int i=0;i<=res.len;i++)u.x[i]=res.x[i];
}
int C(int n,int m){
	int res=fac[n];
	res=(res*fpow(fac[m],mod-2))%mod;
	res=(res*fpow(fac[n-m],mod-2))%mod;
	return res;
}
signed main(){
	cin>>n>>q;
	fac[0]=1;
	for(int i=1;i<=n*3+3;i++)fac[i]=(fac[i-1]*i)%mod;
	tmp.len=1,tmp.x[0]=tmp.x[1]=1;
	for(int i=0;i<=n+n+n+3;i++)f.x[i]=C(n*3+3,i);
	f.len=n*3+3;
	tmp.len=3,tmp.x[0]=1,tmp.x[1]=3,tmp.x[2]=3,tmp.x[3]=1;
	Del(f,tmp);
	tmp.x[0]=0;
	query(f,tmp);
	while(q--){
		scanf("%d",&x);
		printf("%d\n",f.x[x]);
	}
} 
//(x+1)^3n
2022/7/2 13:06
加载中...