[P1641]羅バレー[SCOI2010】生成された文字列(カタロニア語の数)

タイトルリンクは、
座標系から見ることができる\((0,0)\)\(N + m個の\)ステップは行く((N + M、NM \ \)) だけ右プログラムの数を、\ ((1)\)または右下\((0)\)下、及び行くことができない\(Y = -1 \)この行に。
最後に、単語の制限がされている考慮していない(N + m個の\)\選択された時間\(m個\)右、すなわち、敷設回\(C(N + M、M)\)
次にから対称の原理によれば\((0,0)\)来る\(Y = -1 \)からに相当する\((0、-2)\)来る\(Y = -1 \)同じであるプログラムの数、後ので\(Y = -1 \) 実際にプログラムの数である\((0、-2)\)来る\((N + M、NM )\) スキーム数、すなわち\(C(N + M、
M-1)\) のみタイトルラベル「逆要素」のみだけの組み合わせの数を見つけるために使用されるようになっています。

#include <cstdio>
#define ll long long
int n, m;
const int MOD = 20100403;
void exgcd(ll &x, ll &y, ll a, ll b){
    if(!b){ x = 1; y = 0; return; }
    exgcd(x, y, b, a % b);
    ll z = x; x = y; y = z - a / b * y;
}
int fact[2000010];
ll x, y, X, Y;
int C(int n, int m){
    exgcd(x, y, fact[m], MOD); exgcd(X, Y, fact[n - m], MOD);
    return ((ll)fact[n] * x % MOD * X % MOD + MOD) % MOD;
}
int main(){
    fact[0] = 1;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= 2000000; ++i)
        fact[i] = (ll)fact[i - 1] * i % MOD;
    printf("%d\n", ((C(n + m, m) - C(n + m, m - 1)) % MOD + MOD) % MOD);
    return 0;
}

おすすめ

転載: www.cnblogs.com/Qihoo360/p/11228270.html