卡特兰数+唯一分解定理
题目链接
思路不难,很经典的卡特兰数应用。(如果没有取模的话)
开始直接逆元,结果连样例都过不了。
注意到答案可以写成(2n!)/n!(n+1)!.
将(2n!)分解得到(2n!)=p1c1p2c2…pkck.
同理将n!和(n+1)!分解。将分子分母底数相同的指数相减,将得到的唯一分解表示用快速幂计算即可。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 2e6+7;
const int mod = 1e9;
ll a[maxn];
ll b[maxn];
ll prime[maxn];
ll power(ll a, ll b)
{
ll ans = 1;
while (b)
{
if (b & 1)
{
ans = (ans %mod)*( a % mod)%mod;
}
a = (a %mod* a%mod )% mod;
b >>= 1;
}
return ans;
}
void Prime()
{
prime[0]=prime[1]=1;
for (ll i = 2; i <= 2e6; i++)
{
if (prime[i] == 1)
continue;
for (ll j = 2; i * j <= 2e6; j++)
if(i*j<=2e6) prime[i * j] = 1;
}
}
void solve(ll m,ll a[])
{
for(ll i=2;i<=m;i++){
if(!prime[i]){
for(ll j=i;j<=m;j=j*i){
a[i]+=m/j;
}
}
}
}
int main()
{
ll n,ans=1;
cin>>n;
Prime();
solve(2*n,a);
solve(n,b);
solve(n+1,b);
for(ll i=2;i<=n+1;i++) a[i]=a[i]-b[i];
for(ll i=2;i<=2*n;i++){
if(a[i]){
ans=(ans%mod)*(power(i,a[i])%mod)%mod;
}
}
cout<<ans<<endl;
return 0;
}