Solution CF1854C

· · 题解

inline void add(ll &a,ll b){
    a+=b;
    if(a>=mod) a-=mod;
}
inline void Minus(ll &a,ll b){
    a-=b;
    if(a<0) a+=mod;
}
ll n,m,a[505],f[505][505];
void solve(){
    n=read(), m=read();
    ll ans = 0;
    for(ll i=1;i<=n;i++){
        a[i]=read();
        ans = (ans + m + 1 - a[i]) % mod;
    }
    ll inv2 = qpow(2, mod-2);
    for(ll i=1;i<n;i++){
        ll Dec = a[i+1] - a[i];
        memset(f,0,sizeof(f));
        f[0][0]=1; ll all = (2*m+2-a[i]-a[i+1]);
        for(ll sum=0;sum<=all;sum++){
            for(ll j=0;j<=sum && j<=m+1-a[i];j++){
                ll k = sum - j;
                if(k<=m+1-a[i+1]){
                    if(j-k==Dec){
                        Minus(ans , 1ll * (m+1-a[i]-j) * f[j][k] % mod);
                    }else{
                        ll x = 1ll * f[j][k] * inv2 % mod;
                        add(f[j][k+1], x);
                        add(f[j+1][k], x);
                    }
                }
            }
        }
    } 
    printf("%d\n", ans);
}