关于数组清空
查看原帖
关于数组清空
160839
Prean楼主2020/5/23 13:02

板子应该没啥问题,求教dalao哪儿应该清空,清多长QAQ

#include<cstring>
#include<cstdio>
#define clr(f,len) memset(f,0,(len)<<3)
#define cpy(f,g,len) memcpy(f,g,(len)<<3)
typedef long long ll;
const ll mod=998244353ll,M=5e5+5;
ll n,m,fl,G=3,invG=332748118ll,t[M],f[M],inv[M];
void swap(ll&a,ll&b){
	a^=b^=a^=b;
}
ll pow(ll a,ll b=mod-2){
	ll ans=1;for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod;
	return ans;
}
void trpe(int len){
	if(len==fl)return;fl=len;
	for(int i=0;i<len;++i)t[i]=t[i>>1]>>1|(i&1?len>>1:0);
}
void px(ll*f,ll*g,int len){
	for(int i=0;i<len;++i)f[i]=f[i]*g[i]%mod;
}
void dao(ll*f,int n){
	for(int i=1;i<n;++i)f[i-1]=f[i]*i%mod;
	f[n-1]=0;
}
void jifen(ll*f,int n){
	for(int i=n;i;--i)f[i]=f[i-1]*inv[i]%mod;
	f[0]=0;
}
void NTT(ll*f,bool flag,int n){
	trpe(n);
	int i,k,p,len;ll w,w1;
	for(i=0;i<n;++i)if(i<t[i])swap(f[i],f[t[i]]);
	for(p=2;p<=n;p<<=1){
		len=p>>1;w1=pow(flag?G:invG,(mod-1)/p);
		for(k=0;k<n;k+=p){
			w=1;
			for(i=k;i<k+len;++i){
				ll t=f[i+len]*w%mod;
				if((f[i+len]=f[i]-t)<0)f[i+len]+=mod;
				if((f[i]=f[i]+t)>mod)f[i]-=mod;
				w=w*w1%mod;
			}
		}
	}
	if(flag)return;
	ll invn=pow(n);
	for(i=0;i<n;++i)f[i]=f[i]*invn%mod;
}
void times(ll*f,ll*g,int l1,int l2){
	static ll buf[M];
	int n;
	for(n=1;n<=(l1+l2);n<<=1);
	cpy(buf,g,l2);
	NTT(f,1,n);NTT(buf,1,n);
	px(f,buf,n);NTT(f,0,n);
	clr(buf,n);
}
void invp(ll*f,int m){
	static ll b1[M],b2[M],b3[M];
	int i,n,len;
	for(n=1;n<m;n<<=1);b1[0]=pow(f[0]);
	for(len=2;len<=n;len<<=1){
		for(i=0;i<(len>>1);++i)b3[i]=(b1[i]<<1)%mod;
		for(i=0;i<(len<<1);++i)t[i]=t[i>>1]>>1|(i&1?len:0);
		cpy(b2,f,len);
		NTT(b1,1,len<<1);px(b1,b1,len<<1);
		NTT(b2,1,len<<1);px(b1,b2,len<<1);
		NTT(b1,0,len<<1);clr(b1+len,len);
		for(i=0;i<len;++i)b1[i]=(b3[i]-b1[i]+mod)%mod;
	}
	cpy(f,b1,m);clr(b1,n+n);clr(b2,n+n);clr(b3,n+n);
}
void lnp(ll*f,int m){
	static ll g[M];int n;
	for(n=1;n<m;n<<=1);
	cpy(g,f,m);
	invp(g,m);dao(f,m);
	times(f,g,m,m);
	jifen(f,m-1);
	clr(f+m,m);clr(g,m);
}
void exp(ll*f,int m){
	static ll b1[M],b2[M];int n,i,len;
	for(n=1;n<m;n<<=1);b1[0]=1;
	for(len=2;len<=n;len<<=1){
		cpy(b2,b1,len>>1);lnp(b2,len);
		for(i=0;i<len;++i)b2[i]=(f[i]-b2[i]+mod)%mod;
		b2[0]=(b2[0]+1)%mod;
		times(b1,b2,len,len);
	}
	cpy(f,b1,m);clr(b1,n+n);clr(b2,n+n);
}
signed main(void){
	int i;
	scanf("%lld",&n);inv[1]=1;
	for(i=0;i<n;++i)scanf("%lld",f+i);
	for(int i=2;i<=n;++i)inv[i]=(mod-mod/i)*inv[mod%i];
	exp(f,n);
	for(i=0;i<n;++i)printf("%lld ",f[i]);
}
2020/5/23 13:02
加载中...