HDOJ_ACM_下沙的沙子有几粒?

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
1 1
3 1
 
Sample Output
1
3
View Code
 1 #include <stdio.h>
 2 int main()
 3 {
 4     int m, n, i, j;
 5     _int64 a[21][21] = {0};
 6     for (i = 0; i <= 20; i++)
 7     {
 8         for (j = 0; j <= i; j++)
 9         {
10             if (j == 0)
11                 a[i][j] = 1;
12             else
13                 a[i][j] = a[i - 1][j] + a[i][j - 1];
14         }
15     }
16     while (scanf("%d %d", &m, &n) != EOF)
17     {
18         printf("%I64d\n", a[m][n]);
19     }
20     return 0;
21 }

Key points

Firstly, you must find the recursive relation, F(m, n) = F(m, n - 1) + F(m - 1, n). Because the last letter is H, then it is F(m - 1, n), and the last lett letter is D, then it's F(m, n - 1).

Secondly, you could use recursion to solve the question, or it will be time limit exceeded.

Last but not the least, before programming, you should realize how big the number it is. For this question, you should use _int64 to avoid the number would overflow, and don't forget to use %I64d to print. Besides, you can use long long and %lld in G++. In fact, the results are right, but if you use long long, it can't pass in any environment. You can have a try. 

原文地址:https://www.cnblogs.com/chuanlong/p/2758186.html