luoguP1641 [SCOI2010]生成字符串 组合
可以将问题抽象成选 1 就向右走,选 0 就向上走,且不能经过 y=x+1 的方案数.
考虑容斥:总-不合法.
总方案数就是 $\binom{n+m}{n}$,然后不合法的方案数对于 y=x+1 对称后发现就是 $(-1,1)$ 走到 $(n,m)$ 的方案数.
code:
#include <bits/stdc++.h> #define N 2000009 #define ll long long #define mod 20100403 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int fac[N],inv[N]; void init() { fac[0]=1; for(int i=1;i<N;++i) fac[i]=(ll)fac[i-1]*i%mod; inv[1]=1; for(int i=2;i<N;++i) inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod; for(int i=2;i<N;++i) inv[i]=(ll)inv[i]*inv[i-1]%mod; inv[0]=1; } int C(int x,int y) { return (x<0||y<0||x<y)?0:(ll)fac[x]*inv[y]%mod*inv[x-y]%mod; } int main() { // setIO("input"); int n,m; init(); scanf("%d%d",&n,&m); printf("%d\n",(ll)(C(n+m,n)+mod-C(n+m,n+1))%mod); return 0; }