题目链接:bzoj1485
虽然有点很难看,但是我也没有办法,csdn吞我题解啊。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
#define maxn 500010
#define N 2001000
bool is[N];int cnt;
int mod,n,num[maxn],pri[maxn],mpr[N];
void get_prime()
{
int i,j;cnt=0;
for (i=2;i<=2*n;i++)
{
if (!is[i]) {pri[++cnt]=i;mpr[i]=cnt;}
for (j=1;pri[j]*i<=2*n && j<=cnt;j++)
{
mpr[pri[j]*i]=j;
is[pri[j]*i]=true;
if (i%pri[j]==0) break;
}
}
}
void sw(int x,int t)
{
while (x!=1)
{
num[mpr[x]]+=t;
x/=pri[mpr[x]];
}
}
int qpow(int x,int t)
{
int ret=1;
while (t)
{
if (t&1) ret=(ret*x)%mod;
x=(x*x)%mod;t>>=1;
}return ret;
}
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
scanf("%d%d",&n,&mod);
LL ans=1;get_prime();
for (int i=1;i<=cnt;i++) num[i]=0;
for (int i=2*n;i>n;i--) sw(i,1);
for (int i=2;i<=n+1;i++) sw(i,-1);
for (int i=1;i<=cnt;i++) ans=(ans*qpow(pri[i],num[i]))%mod;
printf("%lld\n",ans);
return 0;
}