首先看到2n,两个一组(a2i-1<a2i)可以想到卡特兰数
设奇数组的是(,偶数组的是),这就转化成了卡特兰数模型
这里用
C(2e6,1e6)大概有1e6位,但有mod p
一开始想*逆元(p不一定素数,exgcd)来搞定除数,但是逆元要求a和mod必须互质,显然不能满足所有数据,比如要乘4关于mod=100的逆元是无法求的
所以采用数分解质因数的方法,统计1~x每个质因数的幂,然后答案*=质因数^幂
这里计算从1~t质因数prime【i】总共的幂次
如1~10中3的幂数计算:10/3=3 ——有3个数3,6,9中有1个3
                                        3/3=1 ——其中9有2个3,上一个3已经被统计了,所以只要再加一次
#include<bits/stdc++.h>
using namespace std;
#define index iiii
typedef long long ll;
const int N=2e6+10;

ll n,mod,index,t,ans;
ll prime[N],cnt;
bool st[N];
ll qmi(ll a,ll b,ll mod){
	ll res=1;
	while(b){
		if(b&1) {
			res=res*a%mod;
		}
		a*=a, a%=mod;
		b>>=1;
	}
	return res;
}

void getPrime(ll n){
	for(int i=2;i<=n;i++){
		if(!st[i]) prime[cnt++]=i;
		for(int j=0;prime[j]<=n/i;j++){
			st[prime[j]*i]=true;
			if(i%prime[j]==0) break;
		}
	}
}
int main(){
	ans=1;
	cin>>n>>mod;
	getPrime(n<<1);
	for(int i=0;i<cnt;i++){
		index=0;
		t=n*2;
		while(t){
			t/=prime[i];
			index+=t;
		}
		t=n+1;
		while(t){
			t/=prime[i];
			index-=t;
		}
		t=n;
		while(t){
			t/=prime[i];
			index-=t;
		}
		ans=ans*qmi(prime[i],index,mod)%mod;

	}
	cout<<ans<<endl;
	return 0;
}