[BZOJ1856][SCOI2010]字符串

来源:互联网 发布:淘宝限时抢购软件 编辑:程序博客网 时间:2024/04/28 19:18

类Catalan数定义
按照推倒Catalan数的方法推倒这题的公式
答案即为

Cmn+mCm1n+m

/**************************************************************    Problem: 1856    User: di4CoveRy    Language: C++    Result: Accepted    Time:800 ms    Memory:1288 kb****************************************************************/#include <iostream>#include <cstdio>#define mod 20100403LLusing namespace std;typedef long long LL;LL n,m;LL qpow(LL a,LL b) {    if (b == 0) return 0;    if (b == 1) return a;    if (b % 2 == 0) {        LL tmp = qpow(a,b/2);        return (tmp * tmp) % mod;    } else {        LL tmp = qpow(a,b-1);        return (tmp * a) % mod;    }}LL C(LL n,LL m) {    LL JCN = 1LL , JCM = 1LL , JCNM = 1LL;    for (int i=1;i<=n;i++) JCN = JCN * i % mod;    for (int i=1;i<=m;i++) JCM = JCM * i % mod;    for (int i=1;i<=n-m;i++) JCNM = JCNM * i % mod;    return (JCN * qpow( (JCM * JCNM) % mod , mod - 2 )) % mod;}int main(){    cin >> n >> m;    if (m > n) {        cout << 0 << endl;        return 0;    }    LL ans = (C(n+m,n) - C(n+m,m-1) + mod) % mod;    cout << ans << endl;    return 0;} 
0 0
原创粉丝点击