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,让你求出有k个数的和为n的种类数(可以为0);很明显的插板法,把n看成n个1,因为可以为0,所以还要加上k个0,即 1 1 1 1 .............0 0 0 0,然后共有n+k-1个空,插入k-1个板,这样的最终结果
代码:
#include <iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<stdlib.h> #include<string> #include<map> #include<set> #include<queue> #include<stack> #include<set> #define inf 0x3f3f3f3f #define eps 1e-5 #define max(a,b) (a)>(b)?(a):(b) #define min(a,b) (a)<(b)?(a):(b) #define N 210 #define MOD 1000000 using namespace std; int c[N+1][N+1]; void init() { int i,j; c[0][0]=1; for(i=1;i<=N;i++) { c[i][0]=1; for(j=1;j<N;j++) { c[i][j]=(c[i-1][j]%MOD+c[i-1][j-1]%MOD)%MOD; } c[i][N]=1; } } int main() { int n,k,ans,i; init(); while(~scanf("%d%d",&n,&k)&&(n||k)) { printf("%d\n",c[n+k-1][k-1]); } return 0; }