WA 40 pts 求调
查看原帖
WA 40 pts 求调
137242
DiaоsiKreator楼主2024/7/27 22:21

都是 read 1 expect xxx

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
using namespace std;
const int N=4000010,lpw=998244353,inv2=499122177,inv3=332748118;
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline void swap(int &x,int &y){x^=y^=x^=y;}
int n,m,k,pos,val,inv;
char s[N];
namespace poly{

int L=1,f[N],g[N],h[N],r[N],c[N];
int A[N],B[N],F[N],G[N];

int qpow(int x,int k){
	int res=1;
	while(k){
		if(k&1)res=1ll*res*x%lpw;
		k>>=1;x=1ll*x*x%lpw;
	}
	return res;
}

void NTT(int L,int *a,int op){
	ull f[N],w[N];
	for(int i=0;i<L;i++)f[i]=a[r[i]=(r[i>>1]>>1)|(i&1?L>>1:0)];
	for(int d=1;d<L;d<<=1){
		int wd=qpow(op?3:inv3,(lpw-1)/(d+d));
		w[0]=1;
		for(int i=1;i<d;i++)w[i]=1ll*w[i-1]*wd%lpw;
		for(int i=0;i<L;i+=d<<1){
			for(int j=0;j<d;j++){
				int y=1ll*w[j]*f[i|j|d]%lpw;
				f[i|j|d]=f[i|j]-y+lpw;
				f[i|j]+=y;
			}
		}
		if(d==(1<<16))
			for(int i=0;i<L;i++)f[i]%=lpw;
	}
	int inv=qpow(L,lpw-2);
	for(int i=0;i<L;i++)a[i]=1ll*f[i]%lpw*(op?1:inv)%lpw;
}

void Inv(int n,int *f,int *g){
	if(n==1){
		g[0]=qpow(f[0],lpw-2);
		return;
	}
	Inv((n+1)>>1,f,g);
	L=1;
	while(L<(n<<1))L<<=1;
	for(int i=0;i<n;i++)c[i]=f[i];
	for(int i=n;i<L;i++)c[i]=0;
	NTT(L,c,1);NTT(L,g,1);
	for(int i=0;i<L;i++)
		g[i]=1ll*(2ll-1ll*g[i]*c[i]%lpw+lpw)%lpw*g[i]%lpw;
	NTT(L,g,0);
	for(int i=n;i<L;i++)g[i]=0;
}

void Dev(int L,int *f,int *g){
	for(int i=1;i<L;i++)g[i-1]=1ll*f[i]*i%lpw;
	g[L-1]=0;
}

void Int(int L,int *f,int *g){
	for(int i=1;i<L;i++)g[i]=1ll*f[i-1]*qpow(i,lpw-2)%lpw;
	g[0]=0;
}

void out(int *f){
	for(int i=0;i<L;i++)cout<<f[i]<<" ";puts("");
}

void Ln(int n,int *f,int *g){
	for(int i=0;i<n<<1;i++)A[i]=B[i]=0;
	Dev(n,f,A);Inv(n,f,B);
	L=1;
	while(L<(n<<1))L<<=1;
	NTT(L,A,1);NTT(L,B,1);
	for(int i=0;i<L;i++)A[i]=1ll*A[i]*B[i]%lpw;
	NTT(L,A,0);Int(n,A,g);
}

void Exp(int n,int *f,int *g){
	for(int i=0;i<n<<1;i++)F[i]=G[i]=0;
	if(n==1){g[0]=1;return;}
	Exp((n+1)>>1,f,g);
	L=1;
	while(L<(n<<1))L<<=1;
	for(int i=0;i<L;i++)F[i]=0;
	Ln(n,g,F);
	for(int i=0;i<n;i++)G[i]=f[i];
	for(int i=n;i<L;i++)G[i]=0;
	NTT(L,g,1);NTT(L,F,1);NTT(L,G,1);
	for(int i=0;i<L;i++)g[i]=1ll*(1ll+G[i]-F[i]+lpw)%lpw*g[i]%lpw;
	NTT(L,g,0);
	for(int i=n;i<L;i++)g[i]=0;
}

void Sqrt(int n,int *f,int *g){
	if(n==1){g[0]=1;return;}
	Sqrt((n+1)>>1,f,g);
	for(int i=0;i<n<<1;i++)F[i]=0;
	Inv(n,g,F);
	L=1;
	while(L<(n<<1))L<<=1;
	for(int i=0;i<n;i++)G[i]=f[i];
	for(int i=n;i<L;i++)G[i]=0;
	NTT(L,g,1);NTT(L,F,1);NTT(L,G,1);
	for(int i=0;i<L;i++)g[i]=1ll*(g[i]+1ll*F[i]*G[i]%lpw)%lpw*inv2%lpw;
	NTT(L,g,0);
	for(int i=n;i<L;i++)g[i]=0;
}

}
using namespace poly;
int main(){
	scanf("%d%s",&n,s+1);
	m=strlen(s+1);
	for(int i=1;i<=m;i++)
		k=1ll*(10ll*k+s[i]-'0')%lpw;
	for(int i=0;i<n;i++)
		scanf("%d",&f[i]);
	for(int i=0;i<=n;i++)
		if(f[i]){pos=i;break;}
	n-=pos;
	for(int i=0;i<n;i++)f[i]=f[i+pos];
	L=1;
	while(L<n)L<<=1;
	inv=qpow(f[0],lpw-2);
	for(int i=0;i<L;i++)
		f[i]=1ll*f[i]*inv%lpw;
	Ln(L,f,h);
	for(int i=0;i<L;i++)
		h[i]=1ll*k*h[i]%lpw;
	Exp(L,h,g);
	val=qpow(f[0],k%(lpw-1));
	for(int i=0;i<n;i++)
		g[i]=1ll*g[i]*val%lpw;
	n+=pos;
	pos=std::min(1ll*pos*k,1ll*n);
	for(int i=n-1;i>=pos;i--)g[i]=g[i-pos];
	for(int i=pos-1;i>=0;i--)g[i]=0;
	for(int i=0;i<n;i++)
		printf("%d ",g[i]);
	return 0;
}
2024/7/27 22:21
加载中...