题意

  • 把n个1,m个0组成字符串,要求任意前k个字符中,1的个数不少于0的个数
  • 求解满足要求的字符串有多少个

思路

  • 总保证前缀和大于0
  • 卡特兰数板子题
  • 求解f(n)
  • 组合数求解要开逆元,x%p的逆元和x的逆元相等

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=20100403;

int f[2010101];
void cal(int x){
    f[1]=1;
    for(int i=2;i<=x;i++){
        f[i]=i*f[i-1]%p;
    }
}
int C(int x,int y){
    int up=p-2;
    int res=1;
    int bas=f[y]*f[x-y]%p;
    while(up){
        if(up&1){
            res=res*bas%p;
        }
        bas=bas*bas%p;
        up>>=1;
    }
    return (f[x]*res%p);
}
signed main(){
    int n,m;
    cin >> n >> m;
    if(n<m) cout << 0 << endl;
    else{
        cal(n+m);
        cout << ((C(n+m,n)-C(n+m,n+1)+p)%p) << endl;
    }
    return 0;
}