题目
分析
- 通过暴力打标可得
- 是卡特兰数
- C(2n,n)/(n+1)
- 然后我们直接求
- 需要用到质因数分解
- 然后约分得到答案
代码
1 #include <cmath>
2 #include <cstdio>
3 #include <cstring>
4 #include <iostream>
5 #include <algorithm>
6 #define ll long long
7 using namespace std;
8 const int maxn=1e6+5;
9 int prime[maxn],vis[2*maxn];
10 int cnt=1,id[2*maxn];
11 int n,p;
12 int pri()
13 {
14 for (int i=2;i<=2*n;i++)
15 {
16 if (!vis[i])
17 {
18 prime[cnt]=i;
19 id[i]=cnt++;
20 }
21 for(int j=1;prime[j]*i<=2*n&&j<=cnt;j++)
22 {
23 vis[prime[j]*i]=1;id[prime[j]*i]=j;
24 if(i%prime[j]==0)break;
25 }
26 }
27 }
28 int tot[maxn];
29 void add(int x,int k)
30 {
31 while (x!=1)
32 {
33 tot[id[x]]+=k;
34 x/=prime[id[x]];
35 }
36 }
37 int main()
38 {
39 ll ans=1;
40 cin>>n>>p;
41 pri();
42 for (int i=n+1;i<=2*n;i++) add(i,1);
43 for (int i=1;i<=n;i++) add(i,-1);
44 add(n+1,-1);
45 for (int i=1;i<=cnt;i++)
46 while (tot[i]) ans=(ans*prime[i])%p,tot[i]--;
47 cout<<ans;
48 return 0;
49 }