求助卡常
查看原帖
求助卡常
642144
This_Rrhar楼主2024/3/20 18:15

人傻常数大

#include<bits/stdc++.h>
using namespace std;
#define _r return*this
#define _o &operator
namespace IO
{
	const int _S=1<<21;
	char b[_S],*p1=b,*p2=b,pb[_S],*pp=pb;
	void fl(){fwrite(pb,1,pp-pb,stdout),pp=pb;}
	struct input
	{
		char gc(){if(p1==p2)p2=(p1=b)+fread(b,1,_S,stdin);return p1==p2?' ':*p1++;}
		input _o>>(char&num){do num=gc();while(num==' '||num=='\n'||num=='\r'||num=='\t');_r;}
		template<typename T>input _o>>(T&x)
		{
			char c=gc();T f=1;
			for(x=0;!isdigit(c);)(c=='-'?f=-1:1),c=gc();
			while(isdigit(c))x=(x*10)+(c^48),c=gc();
			x*=f;_r;
		}
		input(){}
	}in;
	struct output
	{
		void pt(char num){*pp++=num;if(pp-pb==_S)fl();}
		output _o<<(char num){pt(num);_r;}
		template<typename T>output _o<<(T x)
		{
			if(!x){pt(48);_r;}
			if(x<0)pt('-'),x=-x;
			int s[64],t=0;
			while(x)s[++t]=x%10,x/=10;
			while(t)pt(s[t--]+48);
			_r;
		}
		output _o<<(const char*s){int num=0;while(s[num])pt(s[num++]);_r;}
		output(){}
	}out;
	struct fe{~fe(){fl();}}fls;
	
	int read(){int x;return in>>x,x;}
	long long readll(){long long x;return in>>x,x;}
}
using IO::in;
using IO::out;
using IO::read;
using IO::readll;
using ll=long long;

#define N 1600001ll
#define MOD 998244353ll
#define G 3ll

#define popc __builtin_popcountll
#define ctz __builtin_ctzll
#define clz __builtin_clzll

ll qpow(ll x,ll p)
{
	ll res=1;
	while(p)
	{
		if(p&1)(res*=x)%=MOD;
		(x*=x)%=MOD,p>>=1;
	}
	return res;
}
const ll inv2=qpow(2,MOD-2);

ll lim=1,siz;
ll rev[N];
ll rt[N];
void init(ll n)
{
	lim=1,siz=0;
	while(lim<=n)lim<<=1,siz++;
	for(int i=1;i<lim;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(siz-1));
	ll w=qpow(G,(MOD-1)>>siz);
	rt[lim>>1]=1;
	for(int i=(lim>>1)+1;i<lim;i++)rt[i]=rt[i-1]*w%MOD;
	for(int i=(lim>>1)-1;i;i--)rt[i]=rt[i<<1];
}

ll getLen(ll n){return 1<<(64-clz(n));}

void DFT(ll*f,ll n)
{
	static ll a[N];
	for(int i=0,j=siz-ctz(n);i<n;i++)a[rev[i]>>j]=f[i];
	for(int i=1;i<n;i<<=1)for(int j=0;j<n;j+=i<<1)for(int k=0;k<i;k++)
	{
		ll x=a[i|j|k]*rt[i|k]%MOD;
		a[i|j|k]=(a[j|k]-x+MOD)%MOD,(a[j|k]+=x)%=MOD;
	}
	for(int i=0;i<n;i++)f[i]=a[i];
}
void IDFT(ll*f,ll n)
{
	reverse(f+1,f+n),DFT(f,n);
	for(ll i=0,j=MOD-((MOD-1)>>ctz(n));i<n;i++)(f[i]*=j)%=MOD;
}

void getInv(ll*f,ll*g,ll n)
{
	static ll h[N];
	if(n==1)
	{
		g[0]=qpow(f[0],MOD-2);
		return;
	}
	getInv(f,g,(n+1)>>1);
	init(n<<1);
	for(int i=0;i<n;i++)h[i]=f[i];
	for(int i=n;i<lim;i++)h[i]=0;
	DFT(g,lim),DFT(h,lim);
	for(int i=0;i<lim;i++)(g[i]*=((MOD+2-g[i]*h[i]%MOD)%MOD))%=MOD;
	IDFT(g,lim);
	for(int i=n;i<lim;i++)g[i]=0;
}

void Dao(ll*f,ll*g,ll n)
{
	for(int i=1;i<n;i++)g[i-1]=f[i]*i%MOD;
	g[n-1]=0;
}
void JiFen(ll*f,ll*g,ll n)
{
	for(int i=1;i<n;i++)g[i]=f[i-1]*qpow(i,MOD-2)%MOD;
	g[0]=0;
}
void getLn(ll*f,ll*g,ll n)
{
	static ll a[N],b[N];
	init(n<<1);
	for(int i=0;i<lim;i++)a[i]=b[i]=0;
	Dao(f,a,lim),getInv(f,b,n);
	init(n<<1),DFT(a,lim),DFT(b,lim);
	for(int i=0;i<lim;i++)(a[i]*=b[i])%=MOD;
	IDFT(a,lim),JiFen(a,g,lim);
}

void getExp(ll*f,ll*g,ll n)
{
	static ll h[N];
	if(n==1)
	{
		g[0]=1;
		return;
	}
	getExp(f,g,n>>1),getLn(g,h,n);
	init(n),h[0]=(MOD+f[0]+1-h[0])%MOD;
	for(int i=1;i<n;i++)h[i]=(MOD+f[i]-h[i])%MOD;
	DFT(g,lim),DFT(h,lim);
	for(int i=0;i<lim;i++)(g[i]*=h[i])%=MOD;
	IDFT(g,lim);
	for(int i=n;i<lim;i++)g[i]=h[i]=0;
}

void getSqrt(ll*f,ll*g,ll n)
{
	static ll a[N],b[N];
	if(n==1)
	{
		g[0]=1;
		return;
	}
	getSqrt(f,g,(n+1)>>1);
	for(int i=0;i<=n<<1;i++)b[i]=0;
	getInv(g,b,n),init(n<<1);
	for(int i=0;i<n;i++)a[i]=f[i];
	for(int i=n;i<lim;i++)a[i]=0;
	DFT(g,lim),DFT(a,lim),DFT(b,lim);
	for(int i=0;i<lim;i++)(((g[i]+=a[i]*b[i]%MOD)%=MOD)*=inv2)%=MOD;
	IDFT(g,lim);
	for(int i=n;i<lim;i++)g[i]=0;
}

const ll I=qpow(G,((MOD-1)>>2)*3);

ll n,op;

ll f[N],g1[N],g2[N];

ll inv;

int main()
{
	in>>n>>op,inv=qpow(2,MOD-2)*(op?1:qpow(I,MOD-2))%MOD;
	for(int i=0;i<n;i++)f[i]=readll()*I%MOD;
	getExp(f,g1,getLen(n));
	for(int i=0;i<n;i++)f[i]=(MOD-f[i])%MOD;
	getExp(f,g2,getLen(n));
	if(!op)for(int i=0;i<n;i++)g2[i]=(MOD-g2[i])%MOD;
	for(int i=0;i<n;i++)out<<(g1[i]+g2[i])%MOD*inv%MOD<<" ";
}
2024/3/20 18:15
加载中...