函数库01
//素数判断
bool SS(int a){
if(a<=1)return false;
for(int i=2;i*i<=a;i++)
if(a%i==0)return false;
return true;
}
//素数判断(筛选法)
int p[10000010];
void SAI(int u){
for(int i=2;i*i<=u;i++)if(!p[i])
for(int j=i*i;j<=u;j+=i)p[j]=1;
}
//因子和
int YZH(int a){
int x=0,i;
for(i=2;i*i<a;i++)if(a%i==0)x=x+i+a/i;
if(i*i==a)x=x+i;
return x;
}
//因子数
int YZS(int a){
if(a==1)return 1;
int x=2,i;
for(i=2;i*i<a;i++)if(a%i==0)x=x+2;
if(i*i==a)x++;
return x;
}
//最大公约数、最小公倍数(递归版)
int GCD(int a,int b){return b?GCD(b,a%b):a;}
int LCM(int a,int b){return a/GCD(a,b)*b;}
//最大公约数(非递归版)
int GCD(int a,int b){
while(b){
int r=a%b;
a=b;b=r;
}
return a;
}
//回文判断(数值版)
int FZ(int a){
int b=0;
while(a>0){
b=b*10+a%10;
a=a/10;
}
return b;
}
bool HW(int a){return a==FZ(a);}
//回文判断(字符串版)
bool PLD(string s){
int le=s.size();
for(int i=0;i<le/2;i++)
if(s[i]!=s[le-1-i])return false;
return true;
}
//高精度乘法
void multi(int b){
for(int i=1;i<=len;i++)a[i]*=b; //按位相乘
for(int i=1;i<=len-1;i++)a[i+1]+=a[i]/10,a[i]%=10; //进位
while(a[len]>=10)a[len+1]=a[len]/10,a[len]%=10,len++; //增位
}
void print(){
for(int i=len;i>0;i--)printf("%d",a[i]);
puts("");
}
//Catalan数高精版(n<=5000)
#include <stdio.h>
int a[5100][800],len;
void catalan(int n){ //求卡特兰数
int i, j, carry, temp;
a[1][0] = 1;
len = 1;
for(i = 2; i <= n; i++){
for(j = 0; j < len; j++) //乘法
a[i][j] = a[i-1][j]*(4*(i-1)+2);
carry = 0;
for(j = 0; j < len; j++){ //处理相乘结果
temp = a[i][j] + carry;
a[i][j] = temp % 10000;
carry = temp / 10000;
}
while(carry){ //进位处理
a[i][len++] = carry % 10000;
carry /= 10000;
}
carry = 0;
for(j = len-1; j >= 0; j--){ //除法
temp = carry*10000 + a[i][j];
a[i][j] = temp/(i+1);
carry = temp%(i+1);
}
while(!a[i][len-1])len--; //高位零处理
}
}
int main(){
int n,i;
scanf("%d",&n);
catalan(n);
//printf("%d\n",len);
printf("%d",a[n][len-1]);
for(i=len-2;i>=0;i--)printf("%04d",a[n][i]);
puts("");
return 0;
}
//输入优化
inline int read(){
int x=0;char ch;bool f=true;
while(!isdigit(ch=getchar()))if(ch=='-')f=false;
for(x=ch^48;isdigit(ch=getchar());)x=(x<<3)+(x<<1)+(ch^48);
return f?x:-x;
}
inline int read(){
int x=0,w=0; char ch=0;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return w?-x:x;
}

浙公网安备 33010602011771号