卡特兰数

#include
using namespace std;
typedef long long ll;
const ll maxn=1e9;
bool vis[120005];
int prime[120005];

ll get(int n,int m){
    int cnt=0;
    while(n){
        cnt+=n/m;
        n=n/m;
    } return cnt;
}

void mul(vector &ans,int a){
    int len=ans.size(); ll t=0;
    for(int i=0;i>n;
    vector ans;
    ans.push_back(1);
    for(int i=2;i<=n;i++){
        for(int j=i*2;j<=2*n;j+=i){
            vis[j]=true;
        }
    }
    for(int i=2;i<=2*n;i++){
        if(!vis[i]){
            prime[i]=get(2*n,i)-2*get(n,i);
        }
    }
    int k=n+1;
    for(int i=2;i<=k;i++){
        while(k%i==0){
            prime[i]--;
            k=k/i;
        }
    }
    for(int i=2;i<=2*n;i++){
        if(!vis[i]){
            while(prime[i]--) mul(ans,i);
        }
    }
    printf("%lld",ans.back());
    for(int i=ans.size()-2;i>=0;i--){
        printf("%09lld",ans[i]);
    }
    return 0;
}

你可能感兴趣的:(组合数学)