Problem A: How do you add?
![](http://uva.onlinejudge.org/external/109/p10943.jpg)
It's a very simple problem - given a number N, how many ways can K numbers less than N add up to N?
For example, for N = 20 and K = 2, there are 21 ways:
0+20
1+19
2+18
3+17
4+16
5+15
...
18+2
19+1
20+0
Input
Each line will contain a pair of numbers N and K. N and K will both be an integer from 1 to 100, inclusive. The input will terminate on 2 0's.Output
Since Larry is only interested in the last few digits of the answer, for each pair of numbers N and K, print a single number mod 1,000,000 on a single line.Sample Input
20 2
20 2
0 0
Sample Output
21
21
这题主要是找规律,因为需要找一个递推公式,可以看到下面的
n k 1 2 3 4 5 …… 100
1 1 2 3 4 5…… 100
2 1 3 6 10 15……
3 1 4 10 20 35 ……
4 1 5 15 35 70 ……
分析后就可发现有 a[i][j]=a[i-1][j]+a[i][j-1],事先要对数组进行预处理,就是a[0][i](0<=i<=99)=i,a[i][0](0<=i<=99)=1,这是我们可以知道的,也是递推的前提条件,然后再对结果进行取模就好了
#include<iostream> # define mod 1000000 using namespace std; int main() { int n,k,i,j,a[100][100]; for(i=0;i<100;i++) { a[i][0]=1; a[0][i]=i+1; } for(i=1;i<100;i++) for(j=1;j<100;j++) a[i][j]=(a[i][j-1]+a[i-1][j])%mod; while(cin>>n>>k,n&&k) { cout<<a[n-1][k-1]<<endl; } return 0; }