微软2014实习生及秋令营技术类职位在线测试-题目2 : K-th string

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

Description

Consider a string set that each of them consists of {0, 1} only. All strings in the set have the same number of 0s and 1s. Write a program to find and output the K-th string according to the dictionary order. If such a string doesn’t exist, or the input is not valid, please output “Impossible”. For example, if we have two ‘0’s and two ‘1’s, we will have a set with 6 different strings, {0011, 0101, 0110, 1001, 1010, 1100}, and the 4th string is 1001.

Input

The first line of the input file contains a single integer t (1 ≤ t ≤ 10000), the number of test cases, followed by the input data for each test case.
Each test case is 3 integers separated by blank space: N, M(2 <= N + M <= 33 and N , M >= 0), K(1 <= K <= 1000000000). N stands for the number of ‘0’s, M stands for the number of ‘1’s, and K stands for the K-th of string in the set that needs to be printed as output.

Output

For each case, print exactly one line. If the string exists, please print it, otherwise print “Impossible”.


样例输入
3
2 2 2
2 2 7
4 7 47
样例输出

0101

Impossible

01010111011

我的解答: 
package Kthstring;

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main {
	public static int jc(int n) {
		if (n > 1)
			return n * jc(n - 1);
		else
			return 1;
	}

	public static void main(String[] args) {
		Scanner cin = new Scanner(new BufferedInputStream(System.in));
		int num = cin.nextInt();
		cin.nextLine();
		int tem = 0;
		while (tem < num) {
			int n = cin.nextInt();
			int m = cin.nextInt();
			int t = cin.nextInt();

			int total = jc(n + m) / jc(n) / jc(m);
			if (total < t)
				System.out.println("Impossible");
			else {
				int count = 1;
				int a = (int) (Math.pow(2, m) - 1);
				String s = Integer.toBinaryString(a);

				while (count < t) {
					a = a + 1;
					s = Integer.toBinaryString(a);
					int i = 0;
					for (int j = 0; j < s.length(); j++) {
						char c = s.charAt(j);
						if (c == '1')
							i++;
					}
					if (i == m)
						count++;
				}

				for (; s.length() < (n + m);)
					s = "0" + s;
				System.out.println(s);
			}
			tem++;
		}
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值