hdu-1023

卡特兰数

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
using namespace std;
#define N 108
int a[N][N];
int b[N];
void catalan()
{
	int i,j,len,carry,temp;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	a[1][0]=b[1]=1;
	len=1;
	for(i=2;i<=N-1;++i)
	{
		for(j=0;j<len;++j)
			a[i][j]=a[i-1][j]*(4*i-2);
		carry=0;
		for(j=0;j<len;++j)
		{
			temp=a[i][j]+carry;
			a[i][j]=temp%10;
			carry=temp/10;
		}
		while(carry)
		{
			a[i][len++]=carry%10;
			carry/=10;
		}
		carry=0;
		for(j=len-1;j>=0;--j)
		{
			temp=carry*10+a[i][j];
			a[i][j]=temp/(i+1);
			carry=temp%(i+1);
		}
		while(!a[i][len-1])
			len--;
		b[i]=len;
	}
}
int main()
{
	int i,n;
	catalan();
	while(scanf("%d",&n)!=EOF)
	{
		for(i=b[n]-1;i>=0;--i)
			printf("%d",a[n][i]);
		printf("\n");
	}
	return 0;
}

  

你可能感兴趣的:(hdu-1023)