analysis
https://www.cnblogs.com/cjyyb/p/11111404.html
Code
#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)% V;
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 + v)% v;
for (i = K; i> = 0 ; i -) sur [i] = sur [i + 1 ] * (n-i + v)% v;
for (i = 1 ; i <= K; i ++) y [i] = (y [i- 1 ] + (i- 1 ) * IK [i]% v)% v;
Ans = (+ Ans Work ())% v;
for (i = 1 ; i <= K; i ++) y [i] = (y [i- 1 ] + k [ 2 ] * IK [i]% v)% v;
Ans = (v + ans-work ())% v;
for (i = 1 ; i <= K; i ++) y [i] = (y [i- 1 ] + (n + n-i + 1 ) *% v IK [i]% v)% v;
Ans = (v + ans-work ())% v;
for (i = 1 ; i <= K; i ++) pre [i] = pre [i- 1 ] * (n + n-i + v)% v;
for (i = K; i> = 0 ; i -) sur [i] = sur [i + 1 ] * (n + n-i + v)% v;
Ans = (+ Ans Work ())% v;
Ans = ans * p W (n, MOD 2 ) v%; printf ( " % lld \ n " , (ans + v)% v);
return 0;
}