C ·Non-Decreasing Digits
A number is said to be made up of non-decreasing digits if all the digits to the left of any digit is less than or equal to that digit. For example, the four-digit number 1234 is composed of digits that are non-decreasing. Some other four-digit numbers that are composed of non-decreasing digits are 0011, 1111, 1112, 1122, 2223. As it turns out, there are exactly 715 four-digit numbers composed of non-decreasing digits.
Notice that leading zeroes are required: 0000, 0001, 0002 are all valid four-digit numbers with nondecreasing digits.
For this problem, you will write a program that determines how many such numbers there are with a specified number of digits.
Input
The first line of input contains a single integer P, (1 <= P <= 1000), which is the number of data sets that follow. Each data set is a single line that contains the data set number, followed by a space, followed by a decimal integer giving the number of digits N, (1 <= N <= 64).
Output
For each data set there is one line of output. It contains the data set number followed by a single space, followed by the number of N digit values that are composed entirely of non-decreasing digits.
Sample Input
3
1 2
2 3
3 4
Sample Output
1 55
2 220
3 715
解题思路:每次从10个数字里选k个数(1<=k<=n)组合,这样每种组合就排序好了,然后向其中的k个空隙中添加重复的数字,相当于k个数的方程组等于n-k,这样的非负整数解有多少的问题。所以求本问题的解的公式就为C(10,k)*C(k+n-k-1,n-k)
package OJ;
import java.util.*;
public class P32_temp {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int cases = in.nextInt();
ArrayList<Integer> results = new ArrayList<Integer>();
for(int i=0; i<cases; i++){
int order = in.nextInt();
int n = in.nextInt();
int result = 0;
for(int k=1; k<=n; k++){
result += C(10,k) * C(n-1, n-k);
}
results.add(result);
}
for(int j=0; j<results.size(); j++){
int order = j+1;
System.out.println(order + " " + results.get(j));
}
}
public static int C(int n, int k){
int up = 1;
int down = 1;
for(int i=0; i<k; i++){
up = up*(n-i);
down = (i+1) * down;
}
return up/down;
}
}