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 }