Problem:
Score : 600 points

Problem Statement

Snuke is introducing a robot arm with the following properties to his factory:

The robot arm consists of m sections and m+1 joints. The sections are numbered 1, 2, ..., m, and the joints are numbered 0, 1, ..., m. Section i connects Joint i-1 and Joint i. The length of Section i is d_i.

For each section, its mode can be specified individually. There are four modes: L, R, D and U. The mode of a section decides the direction of that section. If we consider the factory as a coordinate plane, the position of Joint i will be determined as follows (we denote its coordinates as (x_i, y_i)):

(x_0, y_0) = (0, 0).

If the mode of Section i is L, (x_{i}, y_{i}) = (x_{i-1} - d_{i}, y_{i-1}).

If the mode of Section i is R, (x_{i}, y_{i}) = (x_{i-1} + d_{i}, y_{i-1}).

If the mode of Section i is D, (x_{i}, y_{i}) = (x_{i-1}, y_{i-1} - d_{i}).

If the mode of Section i is U, (x_{i}, y_{i}) = (x_{i-1}, y_{i-1} + d_{i}).

Snuke would like to introduce a robot arm so that the position of Joint m can be matched with all of the N points (X_1, Y_1), (X_2, Y_2), ..., (X_N, Y_N) by properly specifying the modes of the sections.
Is this possible?
If so, find such a robot arm and how to bring Joint m to each point (X_j, Y_j).

Constraints

All values in input are integers.

1 \leq N \leq 1000

-10^9 \leq X_i \leq 10^9

-10^9 \leq Y_i \leq 10^9

Partial Score

In the test cases worth 300 points, -10 \leq X_i \leq 10 and -10 \leq Y_i \leq 10 hold.

Input

Input is given from Standard Input in the following format:

N
X_1 Y_1
X_2 Y_2
:
X_N Y_N

Output

If the condition can be satisfied, follow the following format. If the condition cannot be satisfied, print -1.

m
d_1 d_2 ... d_m
w_1
w_2
:
w_N

m and d_i are the configurations of the robot arm. Refer to the problem statement for what each of them means.
Here, 1 \leq m \leq 40 and 1 \leq d_i \leq 10^{12} must hold. Also, m and d_i must all be integers.

w_j is a string of length m that represents the way to bring Joint m of the robot arm to point (X_j, Y_j).
The i-th character of w_j should be one of the letters L, R, D and U, representing the mode of Section i.

Sample Input 1

3
-1 0
0 3
2 -1

Sample Output 1

2
1 2
RL
UU
DR

In the given way to bring Joint m of the robot arm to each (X_j, Y_j), the positions of the joints will be as follows:

To (X_1, Y_1) = (-1, 0): First, the position of Joint 0 is (x_0, y_0) = (0, 0). As the mode of Section 1 is R, the position of Joint 1 is (x_1, y_1) = (1, 0). Then, as the mode of Section 2 is L, the position of Joint 2 is (x_2, y_2) = (-1, 0).

To (X_2, Y_2) = (0, 3): (x_0, y_0) = (0, 0), (x_1, y_1) = (0, 1), (x_2, y_2) = (0, 3).

To (X_3, Y_3) = (2, -1): (x_0, y_0) = (0, 0), (x_1, y_1) = (0, -1), (x_2, y_2) = (2, -1).

Sample Input 2

5
0 0
1 0
2 0
3 0
4 0

Sample Output 2

-1

Sample Input 3

2
1 1
1 1

Sample Output 3

2
1 1
RU
UR

There may be duplicated points among (X_j, Y_j).

Sample Input 4

3
-7 -3
7 3
-3 -7

Sample Output 4

5
3 1 4 1 5
LRDUL
RDULR
DULRD

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using vl = vector<ll>;
using vi = vector<int>;

#define rng(i, a, b) for(int i = (a); i < (b); ++i)
#define rep(n) for(int _ = 0, __ = (int)n; _ < __; _++)
#define stp(i, a, b, c) for (int i = (a); i < (b); i += (c))
#define FOR(x, cont) for (auto &x: cont)
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define eb emplace_back
#define SZ(x) (int)(x).size()
#define pq(T,COMP) priority_queue<T, vector<T>, COMP>
auto bet = [](const ll x, const ll y, const ll i) {
    return x <= i && i <= y;
};
using pii = pair<int,int>;
using vb = vector<bool>;
template <typename T>
struct bit {
    vector<T> a;
    explicit bit(int n, int v = 0) {
        a.resize(n + 1);
        if(v != 0) {
            for (int i = 1; i <= n; ++i) a[i] = v;
        }
    }

    T sum(T x) {
        T res = 0;
        while (x) {
            res += a[x];
            x -= x & -x;
        }
        return res;
    }

    T sum(int l, int r) {
        if (l > r) return 0;
        return sum(r) - sum(l - 1);
    }

    void add(int x, T v) {
        while (x < a.size()) {
            a[x] += v;
            x += x & -x;
        }
    }
    void clear(){
        fill(a.begin(), a.end(), 0);
    }
};
vi get_prime(int n) {
    vi minp(n+1);
    vi p;
    for (int i = 2; i <= n; i++) {
        if (!minp[i]) {
            minp[i] = i;
            p.pb(i);
        }
        FOR(x, p) {
            if (x <= minp[i] && x * i <= n)
                minp[x * i] = x;
        }
    }
    return p;
}

const int mod = 1e9 + 7;

void add_mod(ll &x, const ll &y) {
    x += y;
    if (x >= mod) x -= mod;
}
void sub_mod(ll &x, const ll &y) {
    x -= y;
    if (x < 0) x += mod;
}

// 容易晕！
void get_fail(int *fail, const char *s, int n) {
    if (n <= 1) return;
    for (int i = 0; i < n; i++) fail[i] = 0;
    for (int i = 2; i <= n; i++) { // !caution: <=
//        cout << "i: " << i << endl;
        // s[1..i-1]既是模式串又是文本串
        // 假想模式串的第i-1个字符在模式串的第i-1个字符处失配
        int j = i - 1;
        while (j > 0) { // j is the last fail position
            j = fail[j];
//            cout << "j: " << j << endl;
            if (s[j] == s[i - 1]) {
                fail[i] = j + 1;
                break;
            }
        }
    }
}

//void KMP_match(int *fail, char *s, int m, char *t, int n) {
//    int j = 0, cnt = 0;
//    for (int i = 0; i < n; i++) {
//        if (t[i] == s[j]){
//            ++j;
//            if (j == m) {
//                j = fail[j];
//                ++cnt;
//            }
//        }
//        else {
//            while (j > 0) {
//                j = fail[j];
//                if (s[j] == t[i]) {
//                    ++j;
//                    break;
//                }
//            }
//        }
//    }
//}

void match(const int* fail, const char *s, int &i, char ch) {
    if (ch == s[i]) {
        ++i;
        return;
    }
    while (i > 0) {
        i = fail[i];
        if (ch == s[i]) {
            ++i;
            break;
        }
    }
}

int match2(const int *fail, const char *s, int i, char ch) {
    if (ch == s[i]) {
        return i + 1;
    }
    while (i > 0) {
        i = fail[i];
        if (ch == s[i]) return i + 1;
    }
    return 0;
}



const int N = 1005;

int dx[4] = {0, 0, 1, -1}, dy[4] = {-1, 1, 0, 0};
const char *op = "DURL";

string solve(int x, int y) {
    string s;
    for (int i = 29; i >= 0; i--) {
        int len =  1 << i;
        rng (j, 0, 4) {
            int px = x - len * dx[j], py = y - len * dy[j];
            if (abs(px) + abs(py) <= len - 1) {
                s += op[j];
                x = px, y = py;
                break;
            }
        }
    }
    assert(s.size() == 30);
    reverse(all(s));
    return s;
}



int main() {
#ifdef LOCAL
    freopen("main.in", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<pii> p(n);
    FOR(x, p) cin >> x.first >> x.second;

    bool is_odd = (abs(p[0].first) + abs(p[0].second)) & 1;

    rng (i, 1, n - 1) {
        if ((abs(p[i].first) + abs(p[i].second)) % 2 != is_odd) {
            cout << -1 << endl;
            return 0;
        }
    }
    cout << (is_odd ? 30 : 31) << endl;

    if (!is_odd) {
        cout << 1 << ' ';
    }

    int x = 1;
    rep(29) {
        cout << x << ' ';
        x *= 2;
    }
    cout << '\n';

    rng (i, 0, n) {
        int x = p[i].first, y = p[i].second;
        if (!is_odd) {
            cout << 'U';
            x--;
        }
        cout << solve(x, y) << endl;
    }

    return 0;
}