Codeforces Round #581 (Div. 2) E. Natasha, Sasha and the Prefix Sums

本文详细解析了一道涉及路径和卡特兰数的编程题目,介绍了如何利用动态规划计算特定路径数量。博主参照了优秀解答,并解释了为何C(2n, n-1)表示不合法路径的数量。通过代码展示了解决方案,适用于理解动态规划和组合数学在编程中的应用。
摘要由CSDN通过智能技术生成

前言:好一个问题转换。


题目传送门


  题目类型:路径、卡特兰数。
  解析: 参考了%%%大佬的题解

  基本的推导见上面的博客。
  解释推导中的几个问题。
  1.为什么C(2n,n-1)就是不合法的部分?不会多或者少吗?
  答:想到达(n-1,n+1)无论如何都会经过对角线上面的那条线k1。所有到k1的路径,向右x-1次,向上x次到(n-1,n+1);向右x次,向上x-1次到(n,n)。因为是所有到k1的路径,所以不合法和到(n-1,n+1)是等价的。

  code:

#include <bits\stdc++.h>
#define Lnnnb return 0;
#define ll long long
#define maxn 4040
#define mod 998244853

using namespace std;
void eninit();
ll n,m,c[maxn][maxn];

void scan(){
    cin >> n >> m ;
}

void solve(){
    c[0][0] = 1;
    for(ll i = 1 ; i <= n+m ; ++i){
        c[i][0] = 1;
        for(ll j = 1 ; j <= i ; ++j)
            c[i][j] = (c[i-1][j] + c[i-1][j-1]) %mod;
    }

    ll ans = 0 , las = (c[n+m][n] - c[n+m][n - max(1ll*1,n-m)] + mod)%mod;
    for(ll i = max(1ll*1,n-m) ; i <= n ; ++i){          ///最大前缀和不可能小过n - m
        ll now = ( c[n+m][n] - c[n+m][n-i-1] - las + mod )%mod;
        ans = (ans + now*i )%mod;
        las += now;
    }
    cout << ans << endl ;
}

int main(){
    ios::sync_with_stdio(false);   cin.tie(0);cout.tie(0);
        scan();
        solve();
    Lnnnb
}

void eninit(){

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值