[HNOI2009] 有趣的數列
阿新 • • 發佈:2019-02-11
題目描述:
qwq…
題目分析:
DP打表發現答案即為 Catalan(n)
注意P不保證是質數,通過質因數分解算組合數…
題目連結:
Ac 程式碼:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
const int maxm=2000010;
int prime[maxm],vis[maxm],num[maxm],down[maxm],cnt;
int n,p;
inline int fastpow(int x,int y)
{
int ans=1;
for(;y;y>>=1,x=(1ll*x*x)%p) if(y&1) ans=(1ll*ans*x)%p;
return ans;
}
inline void pre(int N)
{
vis[1]=1;
for(int i=2;i<=N;i++)
{
if(!vis[i]) prime[++cnt]=i,down[i]=cnt;
for(int j=1;j<=cnt&&prime[j]*i <=N;j++)
{
vis[i*prime[j]]=1;
down[i*prime[j]]=j;
if(!(i%prime[j])) break;
}
}
}
inline void tax(int x,int v)
{
while(x!=1)
{
num[down[x]]+=v;
x/=prime[down[x]];
}
}
int main()
{
long long ans=1;
scanf("%d%d ",&n,&p);
pre(2*n);
for(int i=n+2;i<=n*2;i++) tax(i,1);
for(int i=1;i<=n;i++) tax(i,-1);
for(int i=1;i<=cnt;i++) ans=(ans*fastpow(prime[i],num[i]))%p;
printf("%lld\n",ans);
return 0;
}