RT,不知道哪里错了,可能是欧拉筛挂了?求大佬帮忙看看
#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;
}