实就是从左往右扫每个数,把放在奇数项看作入栈,偶数看作出栈,然后就是一个求卡特兰数,但有些直接枚举质因数会超时,筛素数的时候对于每一个数只要记录它的最小质因子,然而出来在把每个数分解掉,比如60,最小质因子是2,变成30,又是2,边15,是3,变5,然后就没了,原来那种质因数分解发会枚举出许多不能再除的数,所以这种快一些
#include<cstdio>
#include<cstring>
#define maxn 1000001
int n,mod,cnt;
int zhishu[maxn],dy[2*maxn],tot[maxn];
bool flag[2*maxn];
long long ans=1;
int shai()
{
for(int i=2;i<=2*n;i++)
{
if(!flag[i])
{
zhishu[++cnt]=i;
dy[i]=cnt;
}
for(int j=1;zhishu[j]*i<=2*n && j<=cnt;j++)
{
flag[zhishu[j]*i]=true;
dy[zhishu[j]*i]=j;
if(i%zhishu[j]==0)
break;
}
}
}
int add(int x,int k)
{
while(x!=1)
{
tot[dy[x]]+=k;
x/=zhishu[dy[x]];
}
}
void prework()
{
scanf("%d%d",&n,&mod);
shai();
}
void mainwork()
{
for(int i=n+1;i<=2*n;i++)
add(i,1);
for(int i=1;i<=n;i++)
add(i,-1);
add(n+1,-1);
for(int i=1;i<=cnt;i++)
while(tot[i])
{
ans=(ans*zhishu[i])%mod;
tot[i]--;
}
}
void print()
{
printf("%lld",ans);
}
int main()
{
prework();
mainwork();
print();
return 0;
}