萌新求助,TLE35pts,求卡常
查看原帖
萌新求助,TLE35pts,求卡常
103732
smarthehe楼主2020/6/11 18:33

按照 Karry 神的方法卡,没有任何作用……

#include <iostream>
#include <cstdio>
using namespace std;
const int N=(1<<19)+5,MOD=998244353;
int A[N],B[N],T1[N],T2[N],E[N],rev[N],g[20],invg[20];
int ppp,qqq;
char buf[1<<20];
inline char gc()
{
	if(ppp==qqq) ppp=0,qqq=fread(buf,1,1<<20,stdin);
	return buf[ppp++];
}
inline int rd1()
{
	char x;
	while((x=gc())<'0'||x>'9');int t=x-'0';
	while((x=gc())>='0'&&x<='9') t=(10ll*t+x-'0')%MOD;
	return t;
}
inline int rd2()
{
	char x;
	while((x=gc())<'0'||x>'9');int t=x-'0';
	while((x=gc())>='0'&&x<='9') t=t*10+x-'0';
	return t;
}
inline int qpow(int x,int y)
{
	int ret=1;
	while(y)
	{
		if(y&1) ret=1ll*ret*x%MOD;
		x=1ll*x*x%MOD;
		y>>=1;
	}
	return ret;
}
inline void NTT(int *p,int lim,int typ)
{
	int i,j,k,cnt=1;
	for(i=0;i<lim;i++) rev[i]=rev[i>>1]>>1|(i&1?lim>>1:0);
	for(i=0;i<lim;i++) if(rev[i]>i) swap(p[i],p[rev[i]]);
	for(i=2;i<=lim;i<<=1)
	{
		int tg= typ==1?g[cnt]:invg[cnt];
		for(j=0;j<lim;j+=i)
		{
			int l=i>>1,tmp=1;
			for(k=0;k<l;k++)
			{
				int tt=1ll*tmp*p[j+k+l]%MOD;
				p[j+k+l]=(p[j+k]-tt+MOD)%MOD;
				p[j+k]=(p[j+k]+tt)%MOD;
				tmp=1ll*tmp*tg%MOD;
			}
		}
		cnt++;
	}
}
void INV(const int *F,int *G,int lim)
{
	int i,lim2=lim<<1;
	if(lim==1){G[0]=qpow(F[0],MOD-2);return;}
	INV(F,G,lim>>1);
	for(i=0;i<lim;i++) T1[i]=F[i];
	for(i=lim;i<lim2;i++) T1[i]=0;
	NTT(G,lim2,1),NTT(T1,lim2,1);
	for(i=0;i<lim2;i++) G[i]=(G[i]*2ll%MOD-1ll*G[i]*G[i]%MOD*T1[i]%MOD+MOD)%MOD;
	NTT(G,lim2,-1);int inv=qpow(lim2,MOD-2);
	for(i=0;i<lim;i++) G[i]=1ll*G[i]*inv%MOD,T1[i]=0;
	for(i=lim;i<lim2;i++) G[i]=0,T1[i]=0;
}
inline void LN(int *p,int lim)
{
	int i,lim2=lim<<1;
	INV(p,B,lim);
	for(int i=0;i<lim;i++) p[i]=1ll*p[i+1]*(i+1)%MOD;
	NTT(p,lim2,1),NTT(B,lim2,1);
	for(i=0;i<lim2;i++) p[i]=1ll*p[i]*B[i]%MOD;
	NTT(p,lim2,-1);int inv=qpow(lim2,MOD-2);
	for(i=0;i<lim;i++) p[i]=1ll*p[i]*inv%MOD,B[i]=0;
	for(i=lim;i<lim2;i++) p[i]=0,B[i]=0;
	for(int i=lim;i>0;i--) p[i]=1ll*p[i-1]*qpow(i,MOD-2)%MOD;p[0]=0;
}
void EXP(const int *F,int *G,int lim)
{
	int i,lim2=lim<<1;
	if(lim==1){G[0]=1;return;}
	EXP(F,G,lim>>1);
	for(i=0;i<lim;i++) T2[i]=G[i];
	for(i=lim;i<lim2;i++) T2[i]=0;
	LN(T2,lim);
	T2[0]=(1+F[0]-T2[0]+MOD)%MOD;
	for(i=1;i<lim;i++) T2[i]=(F[i]-T2[i]+MOD)%MOD;
	NTT(G,lim2,1),NTT(T2,lim2,1);
	for(i=0;i<lim2;i++) G[i]=1ll*G[i]*T2[i]%MOD;
	NTT(G,lim2,-1);int inv=qpow(lim2,MOD-2);
	for(i=0;i<lim;i++) G[i]=1ll*G[i]*inv%MOD,T2[i]=0;
	for(i=lim;i<lim2;i++) G[i]=0,T2[i]=0;
}
int main()
{
	int n=rd2(),k=rd1(),i;
	for(i=0;i<n;i++) A[i]=rd2();
	int lim=1,cnt=0;
	while(lim<=(n<<1)) lim<<=1,cnt++;
	for(i=0;i<=cnt+1;i++)
	{
		g[i]=qpow(3,(MOD-1)/(1<<i));
		invg[i]=qpow(g[i],MOD-2);
	}
	LN(A,lim);
	for(i=0;i<lim;i++) A[i]=1ll*A[i]*k%MOD;
	EXP(A,E,lim);
	for(i=0;i<n;i++) printf("%d ",E[i]);
	return 0;
}
2020/6/11 18:33
加载中...