hdu 2067 卡特兰数

熟悉卡特兰数的人一眼就能看出这题该怎么做,恶心的是这题最大数据为35,结果在long long范围之内,可是如果用递推公式不当,运算过程中还会溢出。解决的办法是换一个递推公式,或者写成我下面这样

/*
* hdu2067/linux.c
* Created on: 2011-7-31
* Author : ben
*/
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<math.h>

void work();
int main() {
#ifndef ONLINE_JUDGE
freopen(
"data.in", "r", stdin);
#endif
work();
return 0;
}

int gcd(int a, int b) {
int c;
if (!a || !b) {
return a > b ? a : b;
}
c
= a % b;
while (c) {
a
= b;
b
= c;
c
= a % b;
}
return b;
}

void work() {
int n, T = 1, i, temp;
unsigned
long long catalan[40] = { 1, 1, 2, 5, 14, 42 };
for (i = 5; i < 35; i++) {
temp
= gcd(4 * i + 2, i + 2);
catalan[i
+ 1] = catalan[i] / ((i + 2) / temp) * ((4 * i + 2) / temp);
}
while (scanf("%d", &n) == 1 && n != -1) {
printf(
"%d %d %I64u\n", T++, n, catalan[n] * 2);
}
}

转载于:https://www.cnblogs.com/moonbay/archive/2011/08/01/2123646.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值