首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【HDU】1267 - 下沙的沙子有几粒?(BigDecimal & 卡特兰数 & 递推 & 打表)

【HDU】1267 - 下沙的沙子有几粒?(BigDecimal & 卡特兰数 & 递推 & 打表)

作者头像
FishWang
发布2025-08-27 09:17:30
发布2025-08-27 09:17:30
10200
代码可运行
举报
运行总次数:0
代码可运行

点击打开题目

下沙的沙子有几粒?

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3862 Accepted Submission(s): 2029

Problem Description

2005年11月份,我们学校参加了ACM/ICPC 亚洲赛区成都站的比赛,在这里,我们获得了历史性的突破,尽管只是一枚铜牌,但获奖那一刻的激动,也许将永远铭刻在我们几个人的心头。借此机会,特向去年为参加ACM亚洲赛而艰苦集训了近半年的各位老队员表示感谢。 实际上,除了获奖以外,在这次比赛期间还有一件事也让我们记忆深刻。那是比赛当天等待入场的时候,听到某个学校的一个队员在说:“有个学校的英文名很有意思,叫什么Hangzhou Dianzi University”. 哈哈,看来我们学校的英文名起的非常好,非常吸引人呀。 不过,事情的发展谁也没有料到,随着杭电英文校名的这一次曝光,影响越来越大,很多人开始对杭电英文校名进行研究,不久以后甚至还成立了一个专门的研究机构,叫做“HDU 校名研究会”。并不断有报道说-相-当-多的知名科学家改行,专门对该问题进行研究,学术界称之为“杭电现象”。很多人在国际知名期刊上发表了研究论文,这其中,尤以中国超级女科学家宇春小姐写的一篇研究报告最为著名,报告发表在science上,标题是“杭电为什么这样红?” 文中研究发现:Hangzhou Dianzi University这个校名具有深刻的哲学思想和内涵,她同时提出了一个大胆的猜想:“假定一个字符串由m个H和n个D组成,从左到右扫描该串,如果字符H的累计数总是不小于字符D的累计数,那么,满足条件的字符串总数就恰好和下沙的沙粒一样多。” 这就是当今著名的“宇春猜想”! 虽然还没能从数学上证明这个猜想的正确性,但据说美国方面在小布什的亲自干预下,已经用超级计算机验证了在(1<=n<=m<=1000000000000)时都是正确的。my god! 这是一个多么伟大的猜想!虽然我们以前总说,21世纪是属于中国的,可还是没想这一天来的这么早,自豪ing... + 感动ing... 感动和自豪之余,问题也来了,如果已知m和n的值,请计算下沙的沙粒到底有多少。 Ps: 1. 中国有关方面正在积极行动,着手为宇春小姐申报诺贝尔奖。 2、“宇春猜想”中提到的H和D组成的字符串现在被学术界成为“杭电串串”(“杭电串串”前不久被一个卖羊肉串的注册了商标,现在我校正在积极联系买断,据说卖方的底价是1000万欧元,绝不打折,看来希望不大,sigh...)

Input

输入数据包含多个测试实例,每个占一行,由两个整数m和n组成,m和 n 分别表示字符串中H和D的个数。由于我们目前所使用的微机和老美的超级计算机没法比,所以题目给定的数据范围是(1<=n<=m<=20)。

Output

对于每个测试实例,请输出下沙的沙粒到底有多少,计算规则请参考“宇春猜想”,每个实例的输出占一行。

Sample Input

代码语言:javascript
代码运行次数:0
运行
复制
   1 1
3 1

Sample Output

代码语言:javascript
代码运行次数:0
运行
复制
   1
3

Author

lcy

Source

HDU 2006-4 Programming Contest

这题目描述……可以,这很杭电。

我自己画了一个表格,看出来递推的方法了。

表格:

好了现在我们看图说规律。首先看对角线红字的部分,可以看出是卡特兰数,也就是说n==m的情况下,输出应该是卡特兰数。然后再中间部分,从蓝色的地方,我们可以观察到,它的值的得出是由两个黄色箭头的数相加得到,然后我们就递推就行了。

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
import java.math.BigDecimal;
import java.util.Scanner;

public class Main
{
	public static void main(String[] args)
	{
	    Scanner sc = new Scanner(System.in); 
	    BigDecimal Cat[] = new BigDecimal [22];
	    BigDecimal one = new BigDecimal(1);
	    BigDecimal two = new BigDecimal(2);
	    BigDecimal four = new BigDecimal(4);
	    Cat[1] = Cat[0] = new BigDecimal(1);
	    for (int i = 2 ; i <= 20 ; i++)     //打印卡特兰数
	    {
	        BigDecimal t = new BigDecimal(i);
	        Cat[i] = Cat[i-1].multiply(four.multiply(t).subtract(two)).divide(t.add(one));
	    }
	    BigDecimal dp[][] = new BigDecimal [22][22];
	    for (int i = 1 ; i <= 20 ; i++)
	    {
	        dp[i][0] = new BigDecimal(1);
	    }
	    for (int i = 1 ; i <= 20 ; i++)     //n==m时,结果为其对应的卡特兰数
	    {
	        dp[i][i] = Cat[i];
	    }
	    for (int i = 2 ; i <= 20 ; i++)
	    {
	        for (int j = 1 ; j < i ; j++)
	        {
	            dp[i][j] = dp[i-1][j].add(dp[i][j-1]);
	        }
	    }
	    while (sc.hasNext())        //输入
	    {
	        int m = sc.nextInt();
	        int n = sc.nextInt();
	        System.out.println(dp[m][n]);
	    }
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下沙的沙子有几粒?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档