您的位置:首页 > 其它

hdu 1130 How Many Trees?(卡特兰数)

2012-11-28 19:42 435 查看
卡特兰数高精度。

View Code

/*
Author:Zhaofa Fang
Lang:C++
*/
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;

typedef long long ll;
#define DEBUG(x) cout<< #x << ':' << x << endl
#define REP(i,n) for(int i=0;i < (n);i++)
#define FOR(i,s,t) for(int i = (s);i <= (t);i++)
#define PII pair<int,int>
#define PB push_back
#define MP make_pair
#define ft first
#define sd second
#define lowbit(x) (x&(-x))
#define INF (1<<30)

int f[105][200];
void product(int a[],int b[],int c[])
{
REP(j,200)c[j]=0;
int e = 0;
int N = 200-1;
while(N>=0 && !b
)N--;
REP(k,N+1)
{
for(int j=0;j+k<200;j++)
{
int tmp = a[j] * b[k];
int tmp1 = tmp + c[j+k] + e;
c[j+k] = (tmp1)%10;
e = (tmp1)/10;
}
}
}
void print(int a[])
{
int k = 200 - 1;
while(k>=0 && !a[k])k--;
for(int i=k;i>=0;i--)printf("%d",a[i]);
puts("");
}
void pre(void)
{
f[3][0] = f[2][0] = 1;
int tmp[200];
FOR(i,4,102)
{
//puts("**********");
FOR(j,2,i-1)
{
product(f[j],f[i - j + 1],tmp);
//DEBUG(j);print(f[j]);
//DEBUG(i-j+1);print(f[i-j+1]);
//print(tmp);
int e = 0;
for(int k=0;k<200;k++)
{
int tmp1 = f[i][k] + tmp[k] + e;
f[i][k] = tmp1%10;
e = tmp1/10;
}
}

}
}

int main()
{
//freopen("in","r",stdin);
pre();
int n;
while(~scanf("%d",&n))print(f[n+2]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: