1 条题解

  • 0
    @ 2025-10-8 17:04:03
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N = 2e6 + 10;
    int n, pr, prime[N]; bool v[N]; LL P;
    void init()
    {
        pr = 0; memset(v, 0, sizeof(v));
        for(int i = 2; i <= 2 * n; i++) 
        {
            if(v[i] == 0) prime[++pr] = i;
            for(int j = 1; j <= pr && (i * prime[j] <= 2 * n); j++)
            {
                v[i * prime[j]] = 1;
                if(i % prime[j] == 0) break;
            }
        }
    }
    LL Catalan(int n)
    {
        LL ans = 1; int M, cnt;
        for(int i = 1; i <= pr; i++)
        {
            if(prime[i] > 2 * n) break;
            M = 2 * n; cnt = 0;
            while(M > 0) M /= prime[i], cnt += M;
            M = n;
            while(M > 0) M /= prime[i], cnt -= M;
            M = n + 1;
            while(M > 0) M /= prime[i], cnt -= M;
            while(cnt--) ans = (ans * prime[i]) % P;
        }
        return ans;
    }
    int main()
    {
        scanf("%d%lld", &n, &P);
        init(); LL ans = Catalan(n);
        printf("%lld\n", ans);
        return 0;
    }
    
    • 1

    【组合数:Catalan数】[HNOI2009] 有趣的数列

    信息

    ID
    3138
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    126
    已通过
    29
    上传者