import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class slo {
public long position;
public long maxLength;
public StringBuilder sb = new StringBuilder();
public Map<Character, Character[]> valuesMap = new HashMap<>();
{
valuesMap.put('a', new Character[]{'b', 'c'});
valuesMap.put('b', new Character[]{'a', 'c'});
valuesMap.put('c', new Character[]{'a', 'b'});
}
public Character lastChar;
public static void main(String[] args) {
slo app = new slo();
app.readInput();
app.process();
app.writeOutput();
}
private void writeOutput() {
System.out.println(sb);
}
private void process() {
char processedTreeFirstChar = 'a' - 1;
for (int i = 0; i < 3; i++) {
double pos = getLog(position + 1L);
processedTreeFirstChar++;
if (pos <= maxLength) {
sb.append(processedTreeFirstChar);
lastChar = processedTreeFirstChar;
break;
}
position -= (1L << maxLength) - 1;
}
if (lastChar == null) {
sb.append("NIE");
return;
}
processTree(position, maxLength);
}
private double getLog(long number) {
long highestBit = Long.highestOneBit(number);
return Long.numberOfTrailingZeros(highestBit) + (highestBit == number ? 0 : 0.5);
}
private void processTree(long positionInATree, long treeSize) {
for (long i = 1; i < treeSize; i++) {
if (positionInATree == 1) // ten wierzcholek juz zostal dodany
return;
positionInATree -= 1; //wyrzucamy korzen
int branch = 0;
double log = getLog(positionInATree + 1L);
if (treeSize - i < log) {
branch = 1;
positionInATree -= (1L << (treeSize - i)) - 1;
}
sb.append(lastChar = valuesMap.get(lastChar)[branch]);
}
}
private void readInput() {
Scanner in = new Scanner(System.in);
maxLength = in.nextLong();
position = in.nextLong();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class slo { public long position; public long maxLength; public StringBuilder sb = new StringBuilder(); public Map<Character, Character[]> valuesMap = new HashMap<>(); { valuesMap.put('a', new Character[]{'b', 'c'}); valuesMap.put('b', new Character[]{'a', 'c'}); valuesMap.put('c', new Character[]{'a', 'b'}); } public Character lastChar; public static void main(String[] args) { slo app = new slo(); app.readInput(); app.process(); app.writeOutput(); } private void writeOutput() { System.out.println(sb); } private void process() { char processedTreeFirstChar = 'a' - 1; for (int i = 0; i < 3; i++) { double pos = getLog(position + 1L); processedTreeFirstChar++; if (pos <= maxLength) { sb.append(processedTreeFirstChar); lastChar = processedTreeFirstChar; break; } position -= (1L << maxLength) - 1; } if (lastChar == null) { sb.append("NIE"); return; } processTree(position, maxLength); } private double getLog(long number) { long highestBit = Long.highestOneBit(number); return Long.numberOfTrailingZeros(highestBit) + (highestBit == number ? 0 : 0.5); } private void processTree(long positionInATree, long treeSize) { for (long i = 1; i < treeSize; i++) { if (positionInATree == 1) // ten wierzcholek juz zostal dodany return; positionInATree -= 1; //wyrzucamy korzen int branch = 0; double log = getLog(positionInATree + 1L); if (treeSize - i < log) { branch = 1; positionInATree -= (1L << (treeSize - i)) - 1; } sb.append(lastChar = valuesMap.get(lastChar)[branch]); } } private void readInput() { Scanner in = new Scanner(System.in); maxLength = in.nextLong(); position = in.nextLong(); } } |
English