首先看到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;
} 
京公网安备 11010502036488号