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;
}

  

posted @ 2020-07-05 08:02  EM-LGH  阅读(165)  评论(0编辑  收藏  举报