题目:
题解:
你当然不能边取模边计算是吧,介于p不一定和组合数互质不能逆元啊
我运用
h[n]=C(2n,n)/(n+1)
的公式,这个除法很不友善啊,一个除不开不就疯了
那就只能分解质因数除了呗,分解这么多基本是n*sqrt(n)的,TTT
可以线筛统计出每个数的最小质因数,分子分母相除的时候把除法当做减法,减掉质因子的次数,最后把剩下的乘起来就好了
最小质因数一定>=2,因此这样是低于nlogn的
代码:
#include <cstdio>
#include <iostream>
#define LL long long
using namespace std;
const int N=1000000;
int mod,n,pri[N*2+5],cnt,minn[N*2+5],wh[N*2+5];bool ss[N*2+5];
void pre()
{
for (int i=2;i<=2*n;i++)
{
if (!ss[i]) pri[++cnt]=i,minn[i]=i;
for (int j=1;j<=cnt && pri[j]*i<=2*n;j++)
{
ss[pri[j]*i]=1;
minn[pri[j]*i]=pri[j];
if (i%pri[j]==0) break;
}
}
}
void add(int x,int vv)
{
while (x!=1)
{
wh[minn[x]]+=vv;
x/=minn[x];
}
}
int main()
{
int T,i;
scanf("%d%d",&n,&mod);
pre();
for (i=n+2;i<=2*n;i++) add(i,1);
for (i=1;i<=n;i++) add(i,-1);
LL ans=1;
for (i=1;i<=cnt;i++)
while (wh[pri[i]]--)
ans=(ans*pri[i])%mod;
printf("%d",ans);
}