您的位置:首页 > 其它

Hdu 1023

2015-09-15 16:50 253 查看
题意:

        输出第n项catalan数。

原理:

令h(0)=1,h(1)=1,catalan数满足递推式:

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)

例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2

h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5

另类递推式:

h(n)=h(n-1)*(4*n-2)/(n+1);

递推关系的解为:

h(n)=C(2n,n)/(n+1) (n=0,1,2,...)

递推关系的另类解为:

h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)

解题思路:

       由于n最大是100,不可能用变量存储结果。所以这题考察的是高精度。我选择了h(n)=h(n-1)*(4*n-2)/(n+1)这个公式。没有把效率优化到最高,就比如先做一遍,把所有结果存到数组里,按照询问直接查表。

代码:

#include <iostream>
#include <cstring>
using namespace std ;

int h[100],hh[100],l,i,j,p,q,le,n;

int main() {
while (cin >> n){
memset(h,0,sizeof(h));
memset(hh,0,sizeof(hh));
//Formal
h[0] = 1;
l = 1;
for (i = 1; i <= n; i++) {
//乘4n-2
p = 4 * i - 2 ;
for (j = 0; j < l; j++){
h[j] = h[j] * p ;
}
for (j = 0; j < l; j++){
h[j+1] = h[j+1] + h[j] / 10;
h[j] = h[j] % 10;
}
while (h[l] > 0) {
h[l+1] += h[l] / 10;
h[l] = h[l] % 10;
l++;
}
//除n+1
q = i + 1;
j = l-1;
le = 0;
while (j>=0) {
le = le * 10 + h[j];
hh[j] = le / q;
le = le % q;
j--;
}
for (j = 0; j < l; j++){
h[j] = hh[j];
}
while (h[l-1] == 0) {
l--;
}
}
for (i = l-1; i >= 0; i--) {
cout << h[i] ;
}
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: