bzoj 1485: [HNOI2009]有趣的数列

卡特兰数(貌似和卡常数有什么py交易)

黄学长是用DP,输出看的。。然而本蒟蒻只知道有卡特兰数这个名字。。(其实,,这个sb  DP能不能写出来还不一定。。)

公式好多,百度一下。。(看起来最初的定义式特别像卷积的样子,然而并不是。。)

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<map>
 5 #include<queue>
 6 #define N 1000005
 7 #define inf 1000000000
 8 #define LL long long
 9 using namespace std;
10 const int mod=1000000007;
11 LL ans=1;
12 int n,P,cnt;
13 int prime[1000005],mn[2000005],num[2000005];
14 bool del[2000005];
15 void get_prime()
16 {
17     for (int i=2; i<=2*n; i++)
18     {
19         if (!del[i]) prime[++cnt]=i,mn[i]=cnt;
20         for (int j=1; prime[j]*i<=2*n && j<=cnt; j++)
21         {
22             del[prime[j]*i]=1; mn[prime[j]*i]=j;
23             if (i%prime[j]==0) break;
24         }
25     }
26 }
27 void add(int x, int f)
28 {
29     while (x!=1)
30     {
31         num[mn[x]]+=f;
32         x/=prime[mn[x]];
33     }
34 }
35 int main()
36 {
37     scanf("%d %d",&n,&P); get_prime();
38     for (int i=2*n; i>n+1; i--) add(i,1);
39     for (int i=1; i<=n; i++) add(i,-1);
40     for (int i=1; i<=cnt; i++)
41         while (num[i]--) ans=(ans*prime[i])%P;
42     printf("%d\n",ans);
43     return 0;
44 }

 

posted @ 2017-03-03 21:28  ws_ccd  阅读(170)  评论(0编辑  收藏  举报