问题:
拉里的数学很差——他通常使用计算器,这在整个大学期间都很好用。不幸的是,他现在和他的好伙伴瑞恩在一次滑雪事故后被击中了一个荒岛。他们现在正试图花一些时间解决一些好的问题,如果他不能回答,莱恩会吃掉拉里,所以他的命运取决于你!
这是一个非常简单的问题——给定一个数 N,小于 N 的 K 个数加起来 N 有多少种方式?
例如,对于 N = 20 和 K = 2,有 21 种方式:
0+20
1+19
2+18
3+17
4+16
5+15
...
18+2
19+1
20+0
输入 每行将包含一对数字 N 和 K。N 和 K 都是从 1 到 100 的整数,包括 1 到 100。输入将在 2 个 0 处终止。输出 由于拉里只对答案的最后几位感兴趣,因此对于每对数字 N 和 K,在一行上打印一个数字 mod 1,000,000。
样本输入
20 2
20 2
0 0
样本输出
21
21
解决方案代码:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
#define maxn 100
typedef long ss;
ss T[maxn+2][maxn+2];
void Gen() {
ss i, j;
for(i = 0; i<= maxn; i++)
T[1][i] = 1;
for(i = 2; i<= 100; i++) {
T[i][0] = 1;
for(j = 1; j <= 100; j++)
T[i][j] = (T[i][j-1] + T[i-1][j]) % 1000000;
}
}
int main() {
//freopen("in.txt", "r", stdin);
ss n, m;
Gen();
while(cin>>n>>m) {
if(!n && !m) break;
cout<<T[m][n]<<endl;
}
return 0;
}
这个计算是如何得出的?它是怎么来的T[i][j] = (T[i][j-1] + T[i-1][j])
?