JZOJ 1353. 有趣的数列
题目
分析
- 通过暴力打标可得
- 是卡特兰数
- 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 }
为何要逼自己长大,去闯不该闯的荒唐