1. 程式人生 > >[HNOI2009] 有趣的數列

[HNOI2009] 有趣的數列

題目描述:

qwq…

題目分析:

DP打表發現答案即為 Catalan(n)

Catalan(n)=C2nnn+1
注意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; }