前言:好一个问题转换。
题目传送门
题目类型:路径、卡特兰数。
解析: 参考了%%%大佬的题解
基本的推导见上面的博客。
解释推导中的几个问题。
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(){
}