View Code of Problem 3846

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.


Back to problem 3846