WA+RE求调!
查看原帖
WA+RE求调!
442615
zhao2008楼主2024/1/28 22:14

RT

样例输出:

1 998244347 998243810 998236969 998193977
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define clr(a,b,n) memset((a),(b),sizeof(ll)*(n))
#define cpy(a,b,n) memcpy((a),(b),sizeof(ll)*(n))
const int N=2.5e5+5,P=998244353;
int n,m,rev[N],revn;
ll a[N];
ll qpow(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=res*a%P;
		a=a*a%P,b>>=1;
	}
	return res;
}
ll inv3=qpow(3,P-2);
void calc_rev(int lim){
	if(revn==lim) return;
	revn=lim;
	for(int i=0;i<lim;i++)
		rev[i]=(rev[i>>1]>>1)|(i&1?lim>>1:0);
}
void calc_num(ll *f,ll *g,int lim){
	for(int i=0;i<lim;i++)
		f[i]=f[i]*g[i]%P;
}
void ntt(ll *f,int lim,bool flag){
	calc_rev(lim);
	for(int i=0;i<lim;i++)
		if(i<rev[i]) swap(f[i],f[rev[i]]);
	for(int Len=2;Len<=lim;Len<<=1){
		int len=Len>>1;
		ll sav=qpow(flag?3:inv3,(P-1)/Len);
		for(int l=0;l<lim;l+=Len){
			ll buf=1;
			for(int i=l;i<l+len;i++){
				ll tmp=buf*f[i+len]%P;
				f[i+len]=(f[i]-tmp+P)%P,f[i]=(f[i]+tmp)%P;
				buf=buf*sav%P;
			}
		}
	}
	if(flag==1) return;
	ll inv=qpow(lim,P-2);
	for(int i=0;i<lim;i++)
		f[i]=f[i]*inv%P;
}
ll r0[N],r[N],g[N];
void INV(ll *f,int limit){
	int lim;for(lim=1;lim<limit;lim<<=1);
	clr(r0,0,lim<<1),clr(r,0,lim<<1),clr(g,0,lim<<1);
	r0[0]=qpow(f[0],P-2);
	for(int len=2;len<=lim;len<<=1){
		for(int i=0;i<(len>>1);i++)
			r[i]=(r0[i]<<1)%P;
		cpy(g,f,len);
		ntt(r0,len<<1,1),ntt(g,len<<1,1);
		calc_num(r0,r0,len<<1);
		calc_num(r0,g,len<<1);
		ntt(r0,len<<1,0),clr(r0+len,0,len);
		for(int i=0;i<len;i++)
			r[i]=(r[i]-r0[i]+P)%P;
	}
	cpy(f,r,limit);
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++)
		scanf("%lld",&a[i]);
	INV(a,n);
	for(int i=0;i<n;i++)
		printf("%lld ",a[i]);
	return 0;
}
2024/1/28 22:14
加载中...