問題:
ラリーは数学がとても苦手です - 彼は通常電卓を使います。残念なことに、彼はスノーボードの事故の後、親友のライアンと一緒に無人島で襲われました。彼らは今、いくつかの良い問題を考え出すのに時間を費やしようとしています.ライアンは答えられない場合、ラリーを食べてしまうので、彼の運命はあなた次第です!
これは非常に単純な問題です - 数 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 までの整数です。入力は 2 つの 0 で終了します。出力 Larry は答えの最後の数桁だけに関心があるため、数値 N と K の各ペアに対して、1,000,000 を法とする 1 つの数値を 1 行に出力します。
サンプル入力
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])
?