分析
https://www.cnblogs.com/cjyyb/p/11111404.html
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e7;
const int mod = 998244353;
int fac[N+20],inv[N+20],pre[N+20],y[N+20],K,ik[N+20],Ans,sur[N+20];
inline int pw(int x,int p){
int res=1;
while(p){
if(p&1)res=res*x%mod;
x=x*x%mod;p>>=1;
}
return res;
}
inline int work(){
int i,j,k,res=0,wh=((K+1)&1)?mod-1:1;
for(i=1;i<=K;i++,wh=mod-wh){
int t=y[i];t=t*wh%mod;
t=t*inv[i-1]%mod*inv[K-i]%mod;
t=t*pre[i-1]%mod*sur[i+1]%mod;
res=(res+t+mod)%mod;
}
return res;
}
signed main(){
int i,j,k,n;
scanf("%lld%lld",&n,&K);
K+=3;fac[0]=pre[0]=sur[K+1]=1;
for(i=1;i<=K;i++)fac[i]=fac[i-1]*i%mod;
inv[K]=pw(fac[K],mod-2);
for(i=K-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
for(i=1;i<=K;i++)ik[i]=pw(i,K-3);
for(i=1;i<=K;i++)pre[i]=pre[i-1]*(n-i+mod)%mod;
for(i=K;i>=0;i--)sur[i]=sur[i+1]*(n-i+mod)%mod;
for(i=1;i<=K;i++)y[i]=(y[i-1]+(i-1)*ik[i]%mod)%mod;
Ans=(Ans+work())%mod;
for(i=1;i<=K;i++)y[i]=(y[i-1]+ik[2]*ik[i]%mod)%mod;
Ans=(Ans+mod-work())%mod;
for(i=1;i<=K;i++)y[i]=(y[i-1]+(n+n-i+1)%mod*ik[i]%mod)%mod;
Ans=(Ans+mod-work())%mod;
for(i=1;i<=K;i++)pre[i]=pre[i-1]*(n+n-i+mod)%mod;
for(i=K;i>=0;i--)sur[i]=sur[i+1]*(n+n-i+mod)%mod;
Ans=(Ans+work())%mod;
Ans=Ans*pw(n,mod-2)%mod;printf("%lld
",(Ans+mod)%mod);
return 0;
}