1 条题解

  • 0
    @ 2023-6-21 20:04:21

    C++ :

    #include"bits/stdc++.h"
    
    using namespace std;
    typedef long long LL;
    
    namespace io{
    	const int L=(1<<18)+1;
    	char _buf[L],*S,*T,c;
    	char gc(){
    		if(S==T){
    			T=(S=_buf)+fread(_buf,1,L,stdin);
    			return S==T?EOF:*S++;
    		}
    		return *S++;
    	}
    	template<class I>void gi(I&x){
    		for(c=gc();c<'0'||c>'9';c=gc());x=c&15;
    		for(c=gc();c>='0'&&c<='9';c=gc())x=x*10+(c&15);
    	}
    	void gs(char*s){for(c=gc();c>='a'&&c<='z';c=gc())*s++=c;}
    	char ro(){for(c=gc();c<'A'||c>'Z';c=gc());return c;}
    	char obuf[L],*op=obuf,*end=obuf+(L-1);
    	void writechar(char x){*op++=x;if(op==end)fwrite(obuf,1,L-1,stdout),op=obuf;}
    	void cbuf(){fwrite(obuf,1,op-obuf,stdout),op=obuf;}
    	char st[25];int tp;
    	template<class T>inline void print(register T a){
    		if(!a)writechar('0');while(a)st[++tp]=a%10+'0',a/=10;while(tp)writechar(st[tp--]);
    	}
    };
    using io::ro;
    using io::gi;
    using io::gs;
    using io::writechar;
    using io::print;
    #define space writechar(' ')
    #define ln writechar('\n')
    
    const int Mod=1000003,m1=998244353,m2=1004535809,pwMod=Mod-1,N=100005,M=1050005;
    const LL P=1002772198720536577LL;
    
    inline int CRT(int r1,int r2){
    	return (((r1-r2)*334845110LL%m2*m1+r1)%P+P)%P%Mod;
    }
    
    int power(int a,int t,int P){
    	int r=1;
    	while(t){
    		if(t&1)r=(LL)r*a%P;
    		a=(LL)a*a%P;t>>=1;
    	}
    	return r;
    }
    
    int inv(int a,int P){
    	return power(a,P-2,P);
    }
    
    int _wn[25],_w[M];
    
    void NTT(int*a,int len,int dft,int P){
    	int i,j=len>>1,k,l,w,wn,c=0,u,v;
    	for(i=1;i<len-1;i++){
    		if(i<j)swap(a[i],a[j]);
    		for(k=len>>1;(j^=k)<k;k>>=1);
    	}
    	for(i=0;i<=21;i++)_wn[i]=power(3,P-1>>i,P);
    	for(l=2;l<=len;l<<=1){
    		i=l>>1,wn=_wn[++c];
    		for(_w[0]=1,i=l>>1,j=1;j<i;j++)_w[j]=(LL)_w[j-1]*wn%P;
    		for (j=0;j<len;j+=l)for(k=0;k<i;k++) {
    			u=a[j+k],v=(LL)a[j+k+i]*_w[k]%P;
    			a[j+k]=(u+v)%P;a[j+k+i]=(u-v+P)%P;
    		}
    	}
    	if(dft==-1){
    		int inv_len=power(len,P-2,P);
    		for(int i=0;i<len;i++)a[i]=(LL)a[i]*inv_len%P;
    		for(int i=1;i<len/2;i++)swap(a[i],a[len-i]);
    	}
    }
    
    int w1[M],w2[M],w3[M],w4[M];
    
    void convol(int*A,int*B,int*R,int len){
    	memcpy(w1,A,len<<2);
    	memcpy(w2,B,len<<2);
    	NTT(w1,len,1,m1);
    	NTT(w2,len,1,m1);
    	for(int i=0;i<len;i++)w3[i]=(LL)w1[i]*w2[i]%m1;
    	NTT(w3,len,-1,m1);
    	memcpy(w1,A,len<<2);
    	memcpy(w2,B,len<<2);
    	NTT(w1,len,1,m2);
    	NTT(w2,len,1,m2);
    	for(int i=0;i<len;i++)w4[i]=(LL)w1[i]*w2[i]%m2;
    	NTT(w4,len,-1,m2);
    	for(int i=0;i<len;i++)R[i]=CRT(w3[i],w4[i]);
    }
    
    int n,m,b,c,d,e,a[N],w,z,A[N<<1],p[N<<1],fac[N<<1],ifac[N<<1],x[M],y[M],h[M],L,cpw[M],icpw[M];
    
    int gl(int n){
    	int l=1;
    	while(l<=n*2)l<<=1;
    	return l;
    }
    
    int ABS(int x){return x<0?-x:x;}
    
    void solve(){
    	static int z[M]={0};
    	b=d,d=e;
    	for(L=1;L<=n*2;L<<=1);
    	memset(x,0,L<<2);
    	memset(y,0,L<<2);
    	for(int i=0,dw=1;i<n;i++){
    		x[n-i]=(LL)dw*fac[i]*a[i]%Mod;
    		y[i]=ifac[i];dw=(LL)dw*d%Mod;
    	}
    	convol(x,y,z,L);
    	for(int i=0;i<n;i++)p[i]=z[n-i];
    	L<<=1;
    	memset(x,0,L<<2);
    	memset(y,0,L<<2);
    	int w=(LL)b*power(d,Mod-2,Mod)%Mod,qw=1;
    	for(int i=0;i<n;i++){
    		x[i]=(LL)ifac[i]*qw*p[i]%Mod*cpw[i]%Mod;
    		qw=(LL)qw*w%Mod;
    	}
    	for(int i=0;i<2*n;i++)y[i]=icpw[ABS(i-n)];
    	convol(x,y,z,L);
    	for(int i=0;i<n;i++)print((LL)cpw[i]*z[i+n]%Mod),ln;
    	io::cbuf(); 
    }
    
    void work(){
    	int ans=0;
    	for(int i=0,w=1;i<n;i++){
    		(ans+=(LL)w*a[i]%Mod)%=Mod;
    		w=(LL)(b+d+e)*w%Mod;
    	}
    	print(ans),ln;ans=0;
    	for(int i=0,w=1;i<n;i++){
    		(ans+=(LL)w*a[i]%Mod)%=Mod;
    		w=(LL)w*e%Mod;
    	}
    	for(int i=1;i<n;i++)print(ans),ln;
    	io::cbuf();
    }
    
    int main(){
    	gi(n),gi(b),gi(c),gi(d),gi(e);
    	for(int i=0;i<n;i++)gi(a[i]);
    	m=2*n-1;
    	fac[0]=1;
    	for(int i=1;i<=m;i++)fac[i]=(LL)fac[i-1]*i%Mod;
    	ifac[m]=inv(fac[m],Mod);
    	for(int i=m;i>=1;i--)ifac[i-1]=(LL)ifac[i]*i%Mod;
    	cpw[0]=icpw[0]=1;
    	LL fc=c,ifc=power(c,Mod-2,Mod),step=c,istep=ifc;
    	for(int i=1;i<=m;i++){
    		cpw[i]=(LL)cpw[i-1]*step%Mod;
    		icpw[i]=(LL)icpw[i-1]*istep%Mod;
    		step=(LL)step*fc*fc%Mod;
    		istep=(LL)istep*ifc*ifc%Mod;
    	}
    	if(c==0){work(),exit(0);}
    	if(b==0){solve(),exit(0);}
    	w=(LL)d*inv(b<<1,Mod)%Mod;
    	z=((LL)e*inv(b,Mod)-(LL)w*w%Mod+Mod)%Mod;
    	for(int i=0,pwz=1,pwb=1;i<n;i++){
    		x[i]=(LL)a[i]*pwb*fac[i]%Mod;
    		y[n-i]=(LL)pwz*ifac[i]%Mod;
    		pwz=(LL)pwz*z%Mod;
    		pwb=(LL)pwb*b%Mod;
    	}
    	convol(x,y,h,gl(n));
    	for(int i=0,pwb=1;i<n;i++)A[2*i]=(LL)h[i+n]*ifac[i]%Mod;
    	memset(x,0,gl(n)<<2);
    	memset(y,0,gl(n)<<2);
    	for(int i=0,pww=1;i<m;i++){
    		x[i]=(LL)A[i]*fac[i]%Mod;
    		y[m-i]=(LL)pww*ifac[i]%Mod;
    		pww=(LL)pww*w%Mod;
    	}
    	convol(x,y,h,gl(m));
    	for(int i=0;i<m;i++)p[i]=(LL)h[i+m]*ifac[i]%Mod;
    	memset(x,0,gl(m)<<3);
    	memset(y,0,gl(m)<<3);
    	for(int i=0;i<m;i++)x[i]=(LL)p[i]*cpw[i]%Mod;
    	for(int i=0;i<m*2;i++)y[i]=icpw[ABS(i-m)];
    	convol(x,y,h,gl(m)<<1);
    	for(int i=0;i<n;i++)print((LL)h[i+m]*cpw[i]%Mod),ln;
    	io::cbuf();
    	return 0;
    }
    
    • 1

    #6067. 「2017 山东一轮集训 Day3」第三题

    信息

    ID
    1029
    时间
    3000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者