Problem A: How do you add?
Larry is very bad at math - he usually uses a calculator, which worked well throughout college. Unforunately, he is now struck in a deserted island with his good buddy Ryan after a snowboarding accident. They're now trying to spend some time figuring out some good problems, and Ryan will eat Larry if he cannot answer, so his fate is up to you!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个正整数的和,有多少种方法?
dp[N][K] 记录和为N,由K个数组成
则有dp[N][K]=sum{ dp[N-1][k-i] }
#include <iostream>
using namespace std;
const int mod=1000000;
int dp[110][110];
void ini(){
dp[0][0]=1;
for(int k=1;k<=100;k++){
for(int sum=0;sum<=100;sum++){
for(int i=0;i<=100-sum;i++){
dp[sum+i][k]=(dp[sum+i][k]+dp[sum][k-1])%mod;
}
}
}
}
int main(){
ini();
int n,k;
while(cin>>n>>k && (n||k)){
cout<<dp[n][k]<<endl;
}
return 0;
}