p5437 【XR-2】约定

分析

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\n",(Ans+mod)%mod);
    return 0;
}

 

posted @ 2019-10-14 07:16  水题收割者  阅读(113)  评论(0编辑  收藏  举报