32:C·Non-Decreasing Digits

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;
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值