萌新求助卡特兰数
查看原帖
萌新求助卡特兰数
198719
洛璟楼主2021/2/28 12:59

RT,不知道哪里错了,可能是欧拉筛挂了?求大佬帮忙看看kk

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int n, p;
int cn[2000010], prime[2000010], m[2000010], ans;
bool fg[2000010];
inline int read()
{
    int x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c>'9')
    {
        if (c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9')
    {
        x = (x << 3) + (x << 1) + (c ^ '0');
        c = getchar();
    }
    return x * f;
}
int qpow(int b, int base)
{
    int ans = 1;
    while (base > 0)
    {
        if (base & 1)
            ans = ans * b % p;
        b = b * b % p;
        base = base >> 1;
    }
    return ans % p;
}
signed main()
{
    n = read();
    p = read();
    int cnt = 0;
    for (int i = 2;i <= 2 * n;++i)
    {
        if (fg[i] == 0)
        {
            prime[++cnt] = i;
            m[i] = i;
            for (int j = 1;j <= cnt && prime[j] * i <= 2 * n;++j)
            {
                fg[i * prime[j]] = 1;
                m[i * prime[j]] = prime[j];
                if (i % prime[j] == 0)
                {
                    break;
                }
            }
        }
    }
    for (int i = 1;i <= n;++i)
    {
        cn[i] = -1;
    }
    for (int i = n + 2;i <= 2 * n;++i)
    {
        cn[i] = 1;
    }
    for (int i = 2 * n;i >= 2;--i)
    {
        if (fg[i] == 1)
        {
            cn[m[i]] += cn[i];
            cn[i / m[i]] += cn[i];
        }
    }
    for (int i = 2;i <= 2 * n;++i)
    {
        if (fg[i] == 0)
        {
            ans = ans * qpow(i, cn[i]) % p;
            ans = ans % p;
        }
    }
    printf("%lld\n", ans);
    return 0;
}
2021/2/28 12:59
加载中...