求卡常
查看原帖
求卡常
788951
TLE_AK楼主2025/6/30 09:29
#include <bits/stdc++.h>
using namespace std;
#define ll long long

namespace acac
{
	
	inline ll read()
	{
		ll ans=0,fh=1;
		char ch=getchar();
		while(ch<'0'||ch>'9')
		{
			if(ch=='-')fh=-1;
			ch=getchar();
		}
		while(ch>='0'&&ch<='9')
		{
			ans=ans*10+ch-'0';
			ch=getchar();
		}
		return ans*fh;
	}

	ll n;
	int m,k,Len;
	const int mod=998244353;
	int wz[2000010];
	int yg[2000010],qaq[500010];
	int A[500010],C[2000010],B[2][2000010],X[2000010],Y[2000010],DA[500010],DC[2000010];
	int jl[2000010];
	
	
	
	
	void print(int A[],int n)//项数 
	{
		cout<<n<<": "; 
		for(int i=0;i<n;i++)
		{
			cout<<A[i]<<' ';			
		}
		cout<<'\n';
	}
	inline int add(int a,int b){return (a+=b)>=mod?a-mod:a;}
	
	
	int readm()
	{
		ll ans=0,fh=1;
		char ch=getchar();
		while(ch<'0'||ch>'9')
		{
			if(ch=='-')fh=-1;
			ch=getchar();
		}
		while(ch>='0'&&ch<='9')
		{
			ans=(ans*10+ch-'0')%mod;
			ch=getchar();
		}
		return ans*fh;
	} 

	inline int ksm(int a,int k,int ok)
	{
		int ans=1,bs=a;
		while(k)
		{
			if(k&1)ans=1ll*bs*ans%mod;
			bs=1ll*bs*bs%mod;
			k>>=1;
		}
		return ans;
	}
	
	int ls=0;
	inline void pre(int xz,int w)
	{
		if(xz==ls)return ;
		for(int i=1;i<xz;i++)
		{
			wz[i]=(wz[i>>1]>>1)|((i&1)<<w);
		}
		ls=xz;
	}
	void init(int n)
	{
		int tot=0;

		for(int i=2;i<=(n<<1);i<<=1)
		{
			yg[++tot]=ksm(3,(mod-1)/i,0);
		}
	}
	int ook;
	inline void NTT(int n,int A[],int tmp)
	{
		
		for(int i=1;i<n;i++)
		{
		
			if(i<wz[i])swap(A[wz[i]],A[i]);
		}
		int tot=0;
		for(int mid=1;(mid<<1)<=n;mid<<=1)
		{
			int len=(mid<<1);
			int num;
			num=yg[++tot];
			for(int j=0;j<n;j+=len)
			{
				int w=1;
				for(int i=j;i<mid+j;i++)
				{
					int v=1ll*w*A[i+mid]%mod;//卡常
					A[i+mid]=add(A[i],mod-v);
				//	if(A[i+mid]<0)A[i+mid]+=mod;
					A[i]=add(A[i],v);
				//	if(A[i]>=mod)A[i]-=mod;
					
					w=1ll*w*num%mod;
				}
			}
		}
		if(tmp==-1)
		{
			reverse(A+1,A+n);			
			int now=ksm(n,mod-2,1);
			jl[n]=now;			
			for(int i=0;i<n;i++)
			{
				A[i]=1ll*A[i]*now%mod; 
			}
		}
	}
	int ycl[3][2000010];
	int BJ,ok;
	inline void cf(int n,int A[],int B[],int ys)
	{
    	for(int i=0;i<(n>>1);i++)
    	{
    		X[i]=A[i],Y[i]=B[i];
    		if(ys&&n==BJ)Y[i]=ycl[ys][i];
		}
		if(ys&&n==BJ)
		{
			for(int i=(n>>1);i<n;i++)
			{
				Y[i]=ycl[ys][i];
			}
		//	print(Y,n);
		}
	//	print(X,n);
		NTT(n,X,1);
		if(!ys||n!=BJ)NTT(n,Y,1);
	//	if(ok)print(Y,n);
		ok=0;
		for(int i=0;i<n;i++)
		{
			X[i]=1ll*X[i]*Y[i]%mod;
		}
		
		NTT(n,X,-1);
		for(int i=0;i<n;i++)
		{
			A[i]=X[i];
			X[i]=Y[i]=0;
			
		}
		//cout<<endl;
	}
	
	
	
	int t;
	
	inline void solve(int m,int A[])
	{
	//	memset(B,0,sizeof(B));
		B[0][0]=ksm(A[0],mod-2,0);
		t=0;
		int len=1;
		int Len=2;
		//cout<<m<<endl;
		while(Len<=m)
		{
			Len<<=1;
			len=(int)floor(log(Len)/log(2)+0.3)-1;
			pre(Len,len);
			t^=1;
		//	memset(B[t],0,sizeof(B[t]));
			for(int i=0;i<=Len;i++)
			{
				B[t][i]=B[t^1][i]*2;
				if(B[t][i]>=mod)B[t][i]-=mod;
			//	cout<<B[t][i]<<' ';
			}
			cf(Len,B[t^1],B[t^1],0);
			cf(Len,B[t^1],A,0);
			for(int i=0;i<=Len;i++)
			{
				B[t][i]=B[t][i]-B[t^1][i];
				if(B[t][i]<0)B[t][i]+=mod;
			}
		//	print(B[t],Len+1);
		//	bas<<=1,Len<<=1,len++;
		//	if(bas<m)pre(Len,len);
		}
	}
	
	inline int qn(int n,int A[])//项数 
	{
	//	memset(B,0,sizeof(B));
		int Len=2;
		int m=n;
		Len=__lg(m)+1;
		Len=(1<<Len);
		solve(Len,A);
		for(int i=0;i<Len;i++)
		{
			A[i]=B[t][i];
		//	cout<<B[t][i]<<' ';
			//cout<<i<<endl;
			B[t][i]=B[t^1][i]=0;
		}

		return Len*2;
	}
	
	int ANS[4000010];
	int CD;
	
	int fc(int n,int m,int A[],int C[],int ANS2[])//A项数,B项数 
	{
		//print(A,n);
		if(n<m)
		{
			for(int i=0;i<m;i++)
			{
				ANS2[i]=A[i];
				
			}
			return Len;
		}
	//	memset(DA,0,sizeof(DA));

		for(int i=0;i<=n;i++)
		{
			DA[n-i]=A[i];
		}
		for(int i=n-m+1;i<=n;i++)
		{
			DA[i]=0;
		}
		
		int cd=CD;
		
		cd=__lg(n*4)+1;
		cd=(1<<cd);
		pre(cd,(int)floor(log(cd)/log(2)+0.3)-1);
		cf(cd,DA,DC,2);
		
		reverse(DA,DA+n-m+1);
		
		for(int i=n-m+1;i<=n;i++)
		{
			DA[i]=0;
		}
		ok=1;
		cf(cd,DA,C,1);

		for(int i=0;i<m;i++)
		{
			ANS2[i]=add(mod,A[i]-DA[i]);
	//		if(ANS2[i]<0)ANS2[i]+=mod;
		}
	
//		for(int i=m;i<=cd;i++)
//		{
//			ANS2[i]=0;
//		}
		return cd;
	}
	
	int f[100010],g[100010],BS[2000010],tz[2000010];
	
	int qm(int Len,int p,int A[],int B[])
	{
		int awa=min(k*2,p);
		pre(Len,(int)floor(log(Len)/log(2)+0.3)-1);
		cf(Len,A,B,0); 
		Len=fc(awa,k,A,tz,qaq);
		memcpy(A,qaq,sizeof (qaq));
	//	print(A,k+1);
		return Len;
		
	}
	
	inline void qd(int A[],int B[],int n)
	{
		for(int i=1;i<n;i++)
		{
			B[i-1]=1ll*i*A[i]%mod;
		}
		B[n-1]=0;
	}
	inline void jf(int A[],int B[],int n)
	{
		for(int i=1;i<n;i++)
		{
			B[i]=1ll*A[i-1]*ksm(i,mod-2,0)%mod;
		}
		B[0]=0;
	}
	
	int LnC[500010];
	void Ln(int A[],int B[],int n)
	{
	//	cout<<n<<endl;
		qd(A,LnC,n);
		for(int i=0;i<=n;i++)
		{
			DA[i]=A[i];
		}
		qn(n,DA);
		//print(A,n);
		int Len=__lg(2*n);
		Len=(1<<Len);
		if(Len<2*n)Len<<=1;
		pre(Len,(int)floor(log(Len)/log(2)+0.3)-1);
		//cout<<Len<<endl; 
		cf(Len,DA,LnC,0); 
		//print(A,n);
		jf(DA,B,n);
		for(int i=Len/2;i<=Len;i++)
		{
			LnC[i]=0;
		}
	}
	int ExC[500010];
	void Exp(int A[],int B[],int n) //拓展次数多一次(2^k) 
	{
		if(n==1)
		{
			B[0]=1;
			return  ;
		}
		Exp(A,B,n>>1);
		Ln(B,ExC,n);
		ExC[0]=add(A[0]+1,mod-ExC[0]);
		for(int i=1;i<n;i++)
		{
			ExC[i]=add(A[i],mod-ExC[i]);
		}
		
		pre(n,(int)floor(log(n)/log(2)+0.3)-1);
		cf(n,B,ExC,0);
		//print(B,n);
		n<<=1;
		for(int i=n/2;i<n;i++)
		{
			ExC[i]=0;
		}
	}
	
	int main()
	{
		init(600000);
		n=read();
		k=readm();
		for(int i=0;i<n;i++)
		{
			f[i]=read();
		}
	//	cout<<k<<endl;
		Ln(f,A,n);
	//	print(A,n); 
		for(int i=0;i<n;i++)
		{
			A[i]=A[i]*(ll)k%mod;
		}
		
		int Len=__lg(n);
		Len=(1<<Len);
		if(Len<n)Len<<=2;
		Exp(A,g,Len);
		for(int i=0;i<n;i++)
		{
			cout<<g[i]<<' ';
		}
		return 0;
	}
 } 
int main()
{
//	freopen("P5245_8.in","r",stdin);
//	freopen("out.out","w",stdout);
	acac::main();
	return 0;
}
/*
6 4
3 -1 0 4
-2 3 1 5
*/

rt,这道题目也没有黑科技啊QWQ
本机上跑1.4到这里就1.62了

2025/6/30 09:29
加载中...