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;
}
输出第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;
}
相关文章推荐
- Fiddler抓取HTTPs流量
- uva 815
- easyui 日期控件格式化
- jquery处理html格式的数据
- 【HEOI2014】【BZOJ3613】南园满地堆轻絮
- Multiply Strings
- 图片水印实现
- sql mysql和sqlserver存在就更新,不存在就插入的写法(转)
- Java for LeetCode 229 Majority Element II
- STL 中的 std::string大小写转换 lowercase、uppercase、Trim、replace、split
- 不用使用动态的版本依赖
- svn 认证失败
- [知其然不知其所以然-6] 为什么initrd尝试从休眠中恢复失败了?
- 删除表空间报错ORA-00604&ORA-02429解决过程
- Android View坐标getLeft, getRight, getTop, getBottom解惑
- Android 多媒体应用:视频播放之VideoView与SurfaceView
- android intent
- 播放视频VideoView和SurfaceView(它是父类)(查看api)(更高级的查看vitamio)
- iOS开发日记19-7.0之后的截屏方法
- Spring MVC控制层的返回类型--String类型与Bean类型