P3200

卡特兰数

#include<bits/stdc++.h>
using namespace std;
long long mp[2000005],p[200005],cnt[2000005],r;
long long qpow(long long a,long long b) {
	long long ans=1;
	do {
		if(b&1)ans=ans*a%r;
		a=a*a%r;
	} while(b/=2);
	return ans;
}
long long main() {
	long long n;
	cin>>n>>r;
	long long pn=0;
	for(long long i=2; i<=2*n; i++) {
		if(!mp[i]) {
			p[++pn]=i;
			mp[i]=i;
		}
		for(long long j=1; j<=pn&&i*p[j]<=2*n; j++) {
			mp[i*p[j]]=p[j];
			if(i%p[j]==0)	break;
		}
	}
	for(long long i=1; i<=n; i++)cnt[i]=-1;
	for(long long i=n+2; i<=2*n; i++)cnt[i]=1;
	for(long long i=2*n; i>1; i--)
		if(mp[i]<i) {
			cnt[mp[i]]+=cnt[i];
			cnt[i/mp[i]]+=cnt[i];
		}
	long long ans=1;
	for(long long i=2; i<=2*n; i++)if(mp[i]==i)ans=ans*qpow(i,cnt[i])%r;
	cout<<ans<<endl;
	return 0;
}
posted @ 2024-10-02 19:29  yzc_is_SadBee  阅读(2)  评论(0编辑  收藏  举报