View Code of Problem 3846

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.


Back to problem 3846