首页 > 其他分享 >P3200

P3200

时间:2024-10-02 19:22:30浏览次数:4  
标签:2000005 a% long mp P3200 ans

卡特兰数

#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;
}

标签:2000005,a%,long,mp,P3200,ans
From: https://www.cnblogs.com/zan-mei-tai-yang/p/18445004

相关文章

  • P3200 [HNOI2009] 有趣的数列
    哇,太恶心了思路首先我们将题意简化,简化后为对于任意一个偶数位所填数必然大于等于自己的下标,那么考虑填数,如果填的偶数比奇数多,那么此时要么填尽偶数后失败,或者下一个位置填奇数就炸,比如偶数刚好多一个,那么必然有一个偶数放在了奇数位,那么本来下一个要填的偶数往前移了一个,导致......
  • P3200 [HNOI2009] 有趣的数列 题解
    P3200[HNOI2009]有趣的数列感性地,我们认为在按照数值从小到大填数时每个时刻所填的奇数位的个数\(x\)不小于所填偶数位的个数\(y\)。我们考虑如何证明这一点。性质1:每一个偶数位上的数都要大于它前面所有的数。这一点应当是显然的。性质2:每一个偶数位上的数都不小于它的下......
  • P3200 [HNOI2009] 有趣的数列
    原题这题我\(O(n^2)\)的做法竟然没有想出来,反思QwQ首先\(O(n^2)\)的做法很好想,我们考虑从小到大往数组里填数,显然我们要求任何时刻编号为奇数的位置要填的比编号为偶数的位置要不少才行于是我们设\(dp_{i,j,k}\)表示填了前\(i\)个数,奇数位填的个数为\(j\),偶数位填的个数为\(k\)......