import std.conv, std.functional, std.range, std.stdio, std.string; import std.algorithm, std.array, std.bigint, std.bitmanip, std.complex, std.container, std.math, std.mathspecial, std.numeric, std.regex, std.typecons; import core.bitop; class EOFException : Throwable { this() { super("EOF"); } } string[] tokens; string readToken() { for (; tokens.empty; ) { if (stdin.eof) { throw new EOFException; } tokens = readln.split; } auto token = tokens.front; tokens.popFront; return token; } int readInt() { return readToken.to!int; } long readLong() { return readToken.to!long; } real readReal() { return readToken.to!real; } bool chmin(T)(ref T t, in T f) { if (t > f) { t = f; return true; } else { return false; } } bool chmax(T)(ref T t, in T f) { if (t < f) { t = f; return true; } else { return false; } } int binarySearch(alias pred, T)(in T[] as) { int lo = -1, hi = cast(int)(as.length); for (; lo + 1 < hi; ) { const mid = (lo + hi) >> 1; (unaryFun!pred(as[mid]) ? hi : lo) = mid; } return hi; } int lowerBound(T)(in T[] as, T val) { return as.binarySearch!(a => (a >= val)); } int upperBound(T)(in T[] as, T val) { return as.binarySearch!(a => (a > val)); } enum DX = [+1, 0, -1, 0]; enum DY = [0, +1, 0, -1]; long get(long x, long y) { const r = max(abs(x), abs(y)); if (x == r && y > -r) { return (2 * r - 1)^^2 + (y - (-r)); } else if (y == r) { return (2 * r - 1)^^2 + 2 * r + (r - x); } else if (x == -r) { return (2 * r - 1)^^2 + 4 * r + (r - y); } else { return (2 * r - 1)^^2 + 6 * r + (x - (-r)); } } int[] solve(long start, long target) { if (start == 1) { if (target == 0) { // 1232121 return [0, 1, 3, 2, 0, 2]; } else { return []; } } long x, y; for (long r = 0; ; ++r) { if (start <= (2 * r - 1)^^2 + 2 * r) { x = r; y = (-r) + (start - (2 * r - 1)^^2); break; } else if (start <= (2 * r - 1)^^2 + 4 * r) { x = r - (start - (2 * r - 1)^^2 - 2 * r); y = r; break; } else if (start <= (2 * r - 1)^^2 + 6 * r) { x = -r; y = r - (start - (2 * r - 1)^^2 - 4 * r); break; } else if (start <= (2 * r - 1)^^2 + 8 * r) { x = (-r) + (start - (2 * r - 1)^^2 - 6 * r); y = -r; break; } } debug { writeln("solve ", start, " ", target, ": ", x, " ", y); } assert(get(x, y) == start); int[] ret; long sum = target ^ start; const x0 = x, y0 = y; for (; get(x, y) > 1; ) { int dir; long xx, yy; if (sum <= 1) { if (get(x, y) == 3) { if (sum == 0) { // 23232121 ret ~= [3, 1, 3, 1, 3, 2, 0, 2]; } else { // 232121 ret ~= [3, 1, 3, 2, 0, 2]; } sum = 0; break; } else { for (dir = 0; dir < 4; ++dir) { xx = x + DX[dir], yy = y + DY[dir]; if (max(abs(x), abs(y)) > max(abs(xx), abs(yy))) { goto found; } } for (dir = 0; dir < 4; ++dir) { xx = x + DX[dir], yy = y + DY[dir]; if (max(abs(x), abs(y)) == max(abs(xx), abs(yy))) { if ((get(x, y) ^ get(xx, yy)) != 1) { goto found; } } } assert(false); } } else { for (dir = 0; dir < 4; ++dir) { xx = x + DX[dir], yy = y + DY[dir]; if ((get(x, y) ^ get(xx, yy)) == 1) { goto found; } } assert(false); } found: ret ~= dir; sum ^= get(xx, yy); x = xx; y = yy; } if (sum != 0) { foreach (dir; 0 .. 4) { if ((get(x0, y0) ^ get(x0 + DX[dir], y0 + DY[dir])) == 1) { ret = [dir, dir ^ 2] ~ ret; break; } } } return ret; } void main() { debug { foreach_reverse (y; -4 .. +4 + 1) { foreach (x; -4 .. +4 + 1) { write(get(x, y), " "); } writeln; } } try { for (; ; ) { const S = readLong(); const T = readLong(); const res0 = solve(S, 0); const res1 = solve(T, 1); int[] ans; foreach (dir; res0) { ans ~= dir; } foreach_reverse (dir; res1) { ans ~= dir ^ 2; } writeln(0); writeln(ans.length); foreach (dir; ans) { write("RULD"[dir]); } writeln; } } catch (EOFException e) { } }