LGP5850题解

来个暴力做法

显然答案是:

\[\prod_{i=0}^{k}(1+ix) \]

\[\exp(\sum_{i=0}^{k}\ln(1+ix)) \]

考虑对 \(\ln\) 求导:

\[\frac{i}{1+ix}=\sum_{j=0}(-1)^{j}i^{j+1}x^j \]

\[\sum_{j=1}\frac{(-ix)^j}{j} \]

\[\sum_{i=0}^{k}\sum_{j=1}^{k}\frac{(-ix)^{j}}{j} \]

\[-\sum_{j=1}^{k}\frac{\sum_{i=0}^{k}(-ix)^{j}}{j} \]

右边的 \(\sum\) 里面是个自然数幂求和,考虑伯努利数:

\[-\sum_{i=1}^{k}(\sum_{j=0}^{k}j^i)\frac{(-x)^{i}}{i} \]

\[S_k(n)=\sum_{i=0}^{k+1}\binom{k+1}{i}B_in^{k-i+1} \]

\[-\sum_{i=1}^{k}S_i(k+1)\frac{(-x)^i}{i} \]

\[-\sum_{i=1}^{n}\frac{(-x)^{i}}{i}\sum_{j=0}^{i+1}\binom{i+1}{j}B_j(k+1)^{i-j+1} \]

\[-\sum_{i=1}^{n}\frac{(-x)^{i}}{i}\sum_{j=0}^{i+1}\frac{(i+1)!}{j!(i+1-j)!}B_j!K^{i-j+1} \]

\[-\sum_{i=1}^{n}\frac{(i+1)!(-x)^{i}}{i}\sum_{j=0}^{i+1}\frac{B_j}{j!}\times\frac{K^{i-j+1}}{(i-j+1)!} \]

右边显然是两个 GF 的卷积:

\[-\sum_{i=1}^{n}i!(-x)^{i}[y^{i+1}]\frac{ye^{Ky}}{e^y-1} \]

别忘了外面还有一个 \(\exp\),常数有点大,\(O(n\log n)\)

实际上似乎有更简单的方法。。。

\[-\sum_{i=1}^{k}(\sum_{j=0}^{k}j^i)\frac{(-x)^{i}}{i} \]

考虑直接把自然数幂求和的 GF 扒出来:

\[\sum_{i=0}\sum_{j=0}^{K}j^i\frac{x^i}{i!} \]

\[\sum_{i=0}^{K}\sum_{j=0}i^j\frac{x^j}{j!} \]

\[\sum_{i=0}^{K}e^{ix} \]

\[\frac{e^{(K+1)x}-1}{e^x-1} \]

直接求逆就可以了。不过和上面差不多就是(

#include<cstdio>
#define IMP(lim,act) for(int qwq=(lim),i=0;i^qwq;++i)act
const int M=1<<20|5,mod=998244353;
int n,k,F[M],G[M];int inv[M<<1],fac[M<<1],ifac[M<<1],buf[M<<1],*w[25];
inline int Getlen(const int&n){
	int len(0);while((1<<len)<n)++len;return len;
}
inline int Add(const int&a,const int&b){
	return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b){
	return b>a?a-b+mod:a-b;
}
inline void swap(int&a,int&b){
	int c=a;a=b;b=c;
}
inline int pow(int a,int b=mod-2){
	int ans(1);for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;return ans;
}
inline void init(const int&n){
	const int&m=Getlen(n);int*now=buf;w[m]=now;now+=1<<m;
	w[m][0]=1;w[m][1]=pow(3,mod-1>>m+1);for(int i=2;i^1<<m;++i)w[m][i]=1ll*w[m][i-1]*w[m][1]%mod;
	for(int k=m-1;k>=0&&(w[k]=now,now+=1<<k);--k)IMP(1<<k,w[k][i]=w[k+1][i<<1]);
	fac[0]=fac[1]=ifac[0]=ifac[1]=inv[0]=inv[1]=1;for(int i=2;i^1<<m;++i)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
	for(int i=2;i^1<<m;++i)fac[i]=1ll*fac[i-1]*i%mod,ifac[i]=1ll*ifac[i-1]*inv[i]%mod;
}
inline void DFT(int*f,const int&M){
	const int&n=1<<M;
	for(int len=n>>1,d=M-1;d>=0;--d,len>>=1)for(int k=0;k^n;k+=len<<1){
		int*W=w[d],*L=f+(k),*R=f+(k|len),x,y;IMP(len,(x=*L,y=*R)),*L++=Add(x,y),*R++=1ll**W++*Del(x,y)%mod;
	}
}
inline void IDFT(int*f,const int&M){
	const int&n=1<<M;
	for(int len=1,d=0;d^M;++d,len<<=1)for(int k=0;k^n;k+=len<<1){
		int*W=w[d],*L=f+(k),*R=f+(k|len),x,y;IMP(len,(x=*L,y=1ll**W++**R%mod)),*L++=Add(x,y),*R++=Del(x,y);
	}
	const int&k=pow(n);IMP(n,f[i]=1ll*f[i]*k%mod);for(int i=1;(i<<1)<n;++i)swap(f[i],f[n-i]);
}
inline void Inv(int*f,const int&n){
	static int b1[M],b2[M],b3[M];const int&m=Getlen(n);b1[0]=pow(f[0]);
	for(int len=1;len<=m;++len){
		IMP(1<<len-1,b2[i]=2ll*b1[i]%mod);IMP(1<<len,b3[i]=f[i]);
		DFT(b1,len+1);DFT(b3,len+1);IMP(1<<len+1,b1[i]=1ll*b1[i]*b1[i]%mod*b3[i]%mod);IDFT(b1,len+1);
		IMP(1<<len,b1[i]=Del(b2[i],b1[i])),b3[i]=b3[1<<len|i]=b1[1<<len|i]=0;
	}
	IMP(n,f[i]=b1[i]);IMP(1<<m,b1[i]=b2[i]=0);
}
inline void Der(int*f,const int&n){
	IMP(n-1,f[i]=1ll*f[i+1]*(i+1)%mod);f[n-1]=0;
}
inline void Int(int*f,const int&n){
	for(int i=n-1;i>=0;--i)f[i+1]=1ll*f[i]*inv[i+1]%mod;f[0]=0;
}
inline void Ln(int*f,const int&n){
	static int g[M];const int&len=Getlen(n+n-2);IMP(n,g[i]=f[i]);Der(f,n);Inv(g,n);
	DFT(f,len);DFT(g,len);IMP(1<<len,g[i]=1ll*f[i]*g[i]%mod),f[i]=0;IDFT(g,len);
	IMP(n-1,f[i]=g[i]);Int(f,n-1);IMP(1<<len,g[i]=0);
}
inline void Exp(int*f,const int&n){
	static int b1[M],b2[M],b3[M];const int&m=Getlen(n);b1[0]=1;
	for(int len=1;len<=m;++len){
		IMP(1<<len-1,b3[i]=b2[i]=b1[i]);Ln(b2,1<<len);IMP(1<<len,b2[i]=Del(f[i],b2[i]));++b2[0];
		DFT(b2,len);DFT(b3,len);IMP(1<<len,b2[i]=1ll*b2[i]*b3[i]%mod);IDFT(b2,len);
		IMP(1<<len-1,b1[1<<len-1|i]=b2[1<<len-1|i]);
	}
	IMP(n,f[i]=b1[i]);IMP(1<<m,b1[i]=b3[i]=0);
}
inline void write(int n){
	static char s[15];int top(0);while(s[++top]=n%10^48,n/=10);while(putchar(s[top]),--top);putchar(10);
}
signed main(){
	scanf("%d%d",&k,&n);init(n+1<<1);F[0]=1;for(int i=1;i<=n+1;++i)F[i]=1ll*(k+1)*F[i-1]%mod;
	IMP(n+2,(F[i]=1ll*F[i]*ifac[i]%mod,G[i]=ifac[i]));IMP(n+1,(F[i]=F[i+1],G[i]=G[i+1]));Inv(G,n+1);
	const int&len=Getlen(n+n+1);DFT(F,len);DFT(G,len);IMP(1<<len,F[i]=1ll*F[i]*G[i]%mod);IDFT(F,len);
	IMP(1<<len,G[i]=0);for(int i=1;i<=n;++i)G[i]=1ll*(i&1?F[i]:mod-F[i])*fac[i]%mod*inv[i]%mod;
	Exp(G,n+1);for(int i=1;i<=n;++i)write(1ll*G[i]*fac[i]%mod);
}
posted @ 2022-07-04 20:35  Prean  阅读(19)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};