先来一道水题开篇
http://poj.org/problem?id=1942
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 26997 | Accepted: 6784 |
Description
Fortunately you have a piece of squared paper and you choose a rectangle of size n*m on the paper. Let's call this rectangle together with the lines it contains a grid. Starting at the lower left corner of the grid, you move your pencil to the upper right corner, taking care that it stays on the lines and moves only to the right or up. The result is shown on the left:
![](https://i-blog.csdnimg.cn/blog_migrate/63b8b2e2f5461f09312012231352375b.jpeg)
Really a masterpiece, isn't it? Repeating the procedure one more time, you arrive with the picture shown on the right. Now you wonder: how many different works of art can you produce?
Input
Output
Sample Input
5 4 1 1 0 0
Sample Output
126 2
Source
看完第一眼就想到了最笨的办法。
对于m*n的rect, 其中元素rect[x][y],
1. 当x=0时,rect[0][y] = 1;
2. 当y=n时,rect[x][n] = 1;
3. rect[x][y] = rect[x-1][y] + rect[x][y+1];
这样从左下算到右上,把整个map的权值标出来,最右上角rect[m][0]的值就是答案。
时间复杂度 O(m*n), 对于两个int32相乘,时刻准备TLE - -
正确解法
“一条 m+n 长度的直线,取其中n个单位长度,竖起来共有C(m+n, n)种取法”
只能说全靠李姐能力...唉,题做少了
#include <iostream>
using namespace std;
double combin(double a, double b) {
if ( b > a - b) {
b = a - b;
}
double tmp = 1;
for (double i = 0; i < b; ++i) {
tmp *= (a - i) / (b - i);
}
return tmp;
}
int main() {
double m, n;
while (true) {
cin >> m >> n;
if ( m == 0 && n == 0) {
break;
} else if (m == 0 || n == 0) {
printf("1\n");
continue;
}
printf("%.0lf\n", combin(m+n, n));
}
return 0;
}