AcWing 130. 火车进出栈问题(卡特兰数)

传送门

#include

using namespace std;
#define ll long long
const ll M = 1e9;//M为压位的最大值
ll a[60004], l, sum[120004];
int n;

void Prime(int b, int f) {
    for (int j = 2; j * j <= b && b != 1; j++)//质因数分解.
        while (b % j == 0) {
            sum[j] += f;
            b /= j;
        }
    if (b)
        sum[b] += f;
}

void High(ll c) {
    for (int i = 1; i <= l; i++)
        a[i] *= c;
    for (int i = 1; i <= l; i++)
        a[i + 1] += a[i] / M, a[i] %= M;//我们需要压缩位置快速处理
    while (a[l + 1])
        ++l;
}

int main() {
    a[1] = 1, l = 1;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)//对于两个组合数相除,我们这道题目必须使用快速的质因数分解法,去处理.
        Prime(n + i, 1);
    for (int i = 2; i <= n + 1; i++)
        Prime(i, -1);
    for (int i = 2; i <= 2 * n; i++)
        for (ll j = 0; j < sum[i]; ++j)
            High(i);//高精度
    printf("%lld", a[l]);
    for (ll i = l - 1; i; --i)
        printf("%09lld", a[i]);//输出
    return 0;
}

你可能感兴趣的:(模板,进阶指南)