import java.math.BigInteger; 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); sc.next(); int i = 1; while (sc.hasNext()) { int n = sc.nextInt(); int k = sc.nextInt(); try { long rs = new Main().kthInterestingNumber(n, k); System.out.println(String.format(strPattern, i, rs)); } catch (RuntimeException e) { System.out.println(String.format(strPattern, i, "IMPOSSIBLE")); } i++; } } 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.