import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { private final static String strPattern = "Case #%d: %s"; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int count = sc.nextInt(); List<Integer[]> inputNumbers = new ArrayList<>(); for (int i = 0; i < count; i++) { int n = sc.nextInt(); int k = sc.nextInt(); inputNumbers.add(new Integer[]{n, k}); } for (int i = 0; i < inputNumbers.size(); i++) { Integer[] inputNumber = inputNumbers.get(i); try { long rs = new Main().kthInterestingNumber(inputNumber[0], inputNumber[1]); System.out.println(String.format(strPattern, i + 1, rs)); } catch (RuntimeException e) { System.out.println(String.format(strPattern, i + 1, "IMPOSSIBLE")); } } } private long kthInterestingNumber(int n, int k) { char[] strNumber = Long.toBinaryString(n).toCharArray(); for (int i = 0; i < k; i++) { strNumber = biggerThanIt(strNumber); } return parseBinaryLong(new String(strNumber)); } private char[] biggerThanIt(char[] charNumbers) { int firstZero = charNumbers.length - 1; int firstOne = charNumbers.length - 1; for (int i = charNumbers.length - 1; i > 0; i--) { if (charNumbers[i] == '0') { firstOne = i; } else { firstZero = i; } if (firstZero > firstOne) { return swap(charNumbers, firstOne, firstZero); } } throw new RuntimeException("IMPOSSIBLE"); } private char[] swap(char[] cs, int i, int j) { char x = cs[i]; cs[i] = cs[j]; cs[j] = x; return cs; } private static long parseBinaryLong(String s) { return new BigInteger(s, 2).longValue(); } } |
Double click to view unformatted code.