卡特兰大数详解
今天膜你赛出了个卡特兰大数,写正常卡特兰数只能得部分分(然而我忘了卡特兰数怎么写,所以爆零了 )
正常卡特兰数:
#include <cstdio>
#include <cmath>
long long h[35];
int main() {
h[0] = h[1] = 1;
int n;
scanf("%d", &n);
for (int i = 2; i <= n; i++) {
h[i] = h[i - 1] * (4 * i - 2) / (i + 1);//递推
}
printf("%lld", h[n]);//注意占位符,输出
return 0;
}
高精卡特兰数:
#include<bits/stdc++.h>
using namespace std;
#define LEN 500
typedef struct
{
int len;
char val[LEN+5];
}HD;
HD add(HD a,HD b)
{
int i;
HD ret=(HD){0,""};
for(i=1;i<=a.len||i<=b.len;i++)
{
ret.val[i]+=a.val[i]+b.val[i];
ret.val[i+1]=ret.val[i]/10;
ret.val[i]%=10;
}
ret.len=i;
if(!ret.val[i])
ret.len--;
return ret;
}
void print(HD a)
{
while(a.len--)
putchar(a.val[a.len+1] + '0');
}
#define N 1000
HD catalan[N+5];
int main()
{
int i,j,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
catalan[i].len=1;
catalan[i].val[1]=1;
}
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
catalan[j]=add(catalan[j-1],catalan[j]);
}
print(catalan[n]);
return 0;
}
至于这道题为什么是卡特兰数,相信你草算纸用的足够多就能发现!