【状压BFS】hihocoder1233(2015 Beijing Regional Online Problem G)

  • 给几个大小不同的箱子,移来移去移成每个位置只有一个,并且箱子从小到大排好的样纸。
  • 首先我们对任何数据,简单离散化一下,可以转换成:大小分别是 0n1 的箱子,对应 0n1 的位置,中间每一步中,一个箱子可以移动到旁边的位置,前提是旁边位置原来没有箱子或者旁边位置处于最上面位置的箱子比它还大。状态显然可以压缩,并且只要我们保证在同一位置的所有箱子都满足题意,也就是上面小下面大,那么对于任何一个箱子,我们只要知道它所在位置即可。
  • 比赛时非常傻逼地用7个整数表示一个状态,并且用 set 判重,复杂度直接多了一个 log ,跑得极慢,于是又想打表,大概半小时后发现一个 bug 。。。于是改掉又重新打。。。当时只剩一个半小时,到最后也只出来了大概 60% 的数据。。。昨天整理文件,翻出那个表提交了一下,发现可以 AC 。然后傻眼了,不知道上次怎么想的。。。这题不就一傻逼状压么。。。为什么要用 set 判重。。。脑子好乱,,早上在纸上写清楚了几个细节,敲了一发就过掉了~

  • 打表代码, O(2n×n)

/* **********************************************

  File Name: 7.cpp

  Auther: zhengdongjian@tju.edu.cn

  Created Time: 2015年09月27日 星期日 18时17分34秒

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

typedef long long ll;

const int MAX = 7;
int n;
struct Node {
    int a[MAX];
    void clear() {
        memset(a, 0, sizeof(a));
    }
    bool operator<(const Node& b)const {
        for (int i = 0; i < n; ++i) {
            if (a[i] < b.a[i]) {
                return true;
            }
        }
        return false;
    }
    bool operator==(const Node& b)const {
        for (int i = 0; i < n; ++i) {
            if (a[i] ^ b.a[i]) {
                return false;
            }
        }
        return true;
    }
};
int a[MAX], b[MAX];
set<Node> vis;

inline int lb(int& x) {
    return x & (-x);
}

inline int bit(int x) {
    x = lb(x);
    int res = 0;
    while (x) {
        x >>= 1;
        ++res;
    }
    return res - 1;
}

typedef pair<Node, int> P;
int bfs(Node start) {
    queue<P> Q;
    Q.push(P(start, 0));
    while (!Q.empty()) {
        P now = Q.front();
        Q.pop();

        bool ok = true;
        for (int i = 0; i < n; ++i) {
            if (now.first.a[i] != i) {
                ok = false;
                break;
            }
        }
        if (ok) {
            return now.second;
        }

        for (int i = 0; i < n; ++i) {
            if (i < n - 1) {
                if (bit(now.first.a[i]) < bit(now.first.a[i + 1])) {
                    Node nxt = now.first;
                    nxt.a[i] ^= lb(now.first.a[i]);
                    nxt.a[i + 1] |= lb(now.first.a[i]);
                    if (vis.find(nxt) == vis.end()) {
                        vis.insert(nxt);
                        Q.push(P(nxt, now.second + 1));
                    }
                }
            }
            if (i > 0) {
                if (bit(now.first.a[i]) < bit(now.first.a[i - 1])) {
                    Node nxt = now.first;
                    nxt.a[i] ^= lb(now.first.a[i]);
                    nxt.a[i - 1] |= lb(now.first.a[i]);
                    if (vis.find(nxt) == vis.end()) {
                        vis.insert(nxt);
                        Q.push(P(nxt, now.second + 1));
                    }
                }
            }
        }
    }
    return -1;
}

int main() {
    while (scanf(" %d", &n) != EOF) {
        for (int i = 0; i < n; ++i) {
            scanf(" %d", a + i);
        }
        memcpy(b, a, sizeof(a));
        sort(b, b + n);
        for (int i = 0; i < n; ++i) {
            a[i] = lower_bound(b, b + n, a[i]) - b;
        }
        Node start;
        start.clear();
        for (int i = 0; i < n; ++i) {
            start.a[i] |= (1 << a[i]);
        }
        vis.clear();
        vis.insert(start);
        printf("%d\n", bfs(start));
    }
    return 0;
}
  • 打表结果
0,
0, -1,
0, 12, 4, 8, 16, 20,
0, 12, 4, 8, 16, 18, 4, 10, 6, 10, 12, 14, 8, 12, 10, 12, 14, 16, 18, 18, 18, 18, 18, 22,
0, 12, 4, 8, 16, 18, 4, 10, 6, 10, 12, 14, 8, 12, 10, 12, 14, 16, 18, 18, 18, 18, 18, 22, 4, 12, 8, 12, 14, 16, 6, 12, 8, 12, 14, 16, 10, 14, 12, 14, 16, 18, 16, 18, 18, 20, 20, 22, 8, 14, 10, 14, 16, 18, 10, 16, 12, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 20, 22, 24, 12, 16, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 22, 22, 22, 22, 22, 26, 22, 24, 22, 24, 24, 26, 22, 24, 24, 24, 26, 28, 24, 26, 26, 28, 28, 32,
0, 12, 4, 8, 16, 18, 4, 10, 6, 10, 12, 14, 8, 12, 10, 12, 14, 16, 18, 18, 18, 18, 18, 22, 4, 12, 8, 12, 14, 16, 6, 12, 8, 12, 14, 16, 10, 14, 12, 14, 16, 18, 16, 18, 18, 20, 20, 22, 8, 14, 10, 14, 16, 18, 10, 16, 12, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 20, 22, 24, 12, 16, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 22, 22, 22, 22, 22, 26, 22, 24, 22, 24, 24, 26, 22, 24, 24, 24, 26, 28, 24, 26, 26, 28, 28, 32, 4, 14, 8, 12, 16, 18, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 22, 22, 24, 6, 14, 10, 14, 16, 18, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 22, 22, 24, 10, 16, 12, 16, 18, 20, 12, 18, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 22, 24, 26, 14, 18, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 18, 20, 20, 22, 22, 24, 22, 24, 24, 26, 26, 28, 20, 22, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 24, 26, 26, 26, 28, 30, 26, 28, 28, 30, 30, 32, 8, 16, 12, 16, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 10, 18, 14, 18, 20, 22, 12, 16, 14, 16, 18, 20, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 22, 24, 20, 22, 22, 24, 24, 26, 24, 26, 26, 26, 28, 30, 22, 24, 24, 26, 26, 28, 24, 26, 24, 26, 26, 28, 26, 28, 28, 28, 30, 30, 28, 30, 30, 30, 32, 34, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 14, 20, 16, 20, 22, 24, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 16, 22, 18, 20, 22, 24, 18, 24, 20, 22, 24, 26, 20, 22, 22, 22, 24, 26, 24, 26, 26, 26, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 28, 30, 32, 24, 26, 26, 26, 28, 30, 26, 28, 28, 28, 30, 32, 28, 28, 30, 30, 30, 32, 30, 32, 32, 32, 34, 36, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 26, 26, 26, 26, 26, 30, 26, 28, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 28, 30, 30, 32, 32, 36, 26, 28, 28, 28, 28, 32, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 30, 32, 32, 34, 34, 36, 26, 28, 28, 30, 30, 32, 28, 30, 28, 30, 30, 32, 30, 30, 32, 32, 32, 34, 32, 34, 34, 34, 36, 38, 28, 30, 30, 30, 32, 34, 30, 32, 32, 32, 34, 36, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 38, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42,
0, 12, 4, 8, 16, 18, 4, 10, 6, 10, 12, 14, 8, 12, 10, 12, 14, 16, 18, 18, 18, 18, 18, 22, 4, 12, 8, 12, 14, 16, 6, 12, 8, 12, 14, 16, 10, 14, 12, 14, 16, 18, 16, 18, 18, 20, 20, 22, 8, 14, 10, 14, 16, 18, 10, 16, 12, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 20, 22, 24, 12, 16, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 22, 22, 22, 22, 22, 26, 22, 24, 22, 24, 24, 26, 22, 24, 24, 24, 26, 28, 24, 26, 26, 28, 28, 32, 4, 14, 8, 12, 16, 18, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 22, 22, 24, 6, 14, 10, 14, 16, 18, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 22, 22, 24, 10, 16, 12, 16, 18, 20, 12, 18, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 22, 24, 26, 14, 18, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 18, 20, 20, 22, 22, 24, 22, 24, 24, 26, 26, 28, 20, 22, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 24, 26, 26, 26, 28, 30, 26, 28, 28, 30, 30, 32, 8, 16, 12, 16, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 10, 18, 14, 18, 20, 22, 12, 16, 14, 16, 18, 20, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 22, 24, 20, 22, 22, 24, 24, 26, 24, 26, 26, 26, 28, 30, 22, 24, 24, 26, 26, 28, 24, 26, 24, 26, 26, 28, 26, 28, 28, 28, 30, 30, 28, 30, 30, 30, 32, 34, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 14, 20, 16, 20, 22, 24, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 16, 22, 18, 20, 22, 24, 18, 24, 20, 22, 24, 26, 20, 22, 22, 22, 24, 26, 24, 26, 26, 26, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 28, 30, 32, 24, 26, 26, 26, 28, 30, 26, 28, 28, 28, 30, 32, 28, 28, 30, 30, 30, 32, 30, 32, 32, 32, 34, 36, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 26, 26, 26, 26, 26, 30, 26, 28, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 28, 30, 30, 32, 32, 36, 26, 28, 28, 28, 28, 32, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 30, 32, 32, 34, 34, 36, 26, 28, 28, 30, 30, 32, 28, 30, 28, 30, 30, 32, 30, 30, 32, 32, 32, 34, 32, 34, 34, 34, 36, 38, 28, 30, 30, 30, 32, 34, 30, 32, 32, 32, 34, 36, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 38, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 4, 16, 8, 12, 18, 20, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 20, 22, 22, 22, 22, 26, 8, 16, 12, 16, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 28, 30, 30, 32, 32, 34, 6, 16, 10, 14, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 8, 16, 12, 16, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 28, 30, 30, 32, 32, 34, 10, 18, 14, 18, 20, 22, 12, 18, 14, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 26, 26, 28, 12, 20, 16, 20, 22, 24, 14, 18, 16, 18, 20, 22, 18, 20, 20, 22, 22, 24, 22, 24, 24, 26, 26, 28, 14, 20, 16, 20, 22, 24, 16, 22, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 28, 30, 32, 24, 26, 26, 28, 28, 30, 26, 28, 26, 28, 28, 30, 28, 30, 30, 30, 32, 32, 30, 32, 32, 32, 34, 36, 14, 20, 16, 20, 22, 24, 16, 22, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 16, 22, 18, 22, 24, 26, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 18, 24, 20, 22, 24, 26, 20, 26, 22, 24, 26, 28, 22, 24, 24, 24, 26, 28, 26, 28, 28, 28, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 28, 30, 30, 30, 32, 34, 26, 28, 28, 28, 30, 32, 28, 30, 30, 30, 32, 34, 30, 30, 32, 32, 32, 34, 32, 34, 34, 34, 36, 38, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 30, 32, 32, 32, 34, 36, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 30, 32, 32, 34, 34, 36, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 32, 34, 34, 36, 36, 38, 28, 30, 30, 32, 32, 34, 30, 32, 30, 32, 32, 34, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 40, 30, 32, 32, 32, 34, 36, 32, 34, 34, 34, 36, 38, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 40, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 40, 38, 40, 40, 40, 42, 44, 8, 18, 12, 16, 20, 22, 12, 18, 14, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 26, 26, 28, 10, 18, 14, 18, 20, 22, 12, 18, 14, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 26, 26, 28, 14, 20, 16, 20, 22, 24, 16, 22, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 30, 32, 32, 34, 34, 36, 10, 20, 14, 18, 22, 24, 14, 20, 16, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 28, 28, 30, 12, 18, 16, 18, 20, 22, 14, 18, 16, 18, 20, 22, 18, 20, 20, 22, 22, 24, 22, 24, 24, 26, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 20, 22, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 12, 20, 16, 20, 22, 24, 14, 20, 16, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 28, 28, 30, 14, 22, 18, 22, 24, 26, 16, 20, 18, 20, 22, 24, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 16, 22, 18, 22, 24, 26, 18, 24, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 28, 30, 30, 30, 32, 34, 26, 28, 28, 30, 30, 32, 28, 30, 28, 30, 30, 32, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 16, 22, 18, 22, 24, 26, 18, 24, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 18, 24, 20, 24, 26, 28, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 20, 26, 22, 24, 26, 28, 22, 28, 24, 26, 28, 30, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 30, 32, 32, 32, 34, 36, 28, 30, 30, 30, 32, 34, 30, 32, 30, 32, 32, 34, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 40, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 32, 34, 32, 34, 36, 36, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 32, 34, 34, 36, 36, 38, 28, 30, 30, 32, 32, 34, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 34, 34, 36, 36, 38, 36, 38, 36, 38, 40, 40, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 38, 40, 42, 42, 34, 36, 36, 38, 38, 40, 36, 38, 36, 38, 38, 40, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 12, 20, 16, 20, 22, 24, 14, 20, 16, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 28, 28, 30, 14, 22, 18, 22, 24, 26, 16, 20, 18, 20, 22, 24, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 16, 22, 18, 22, 24, 26, 18, 24, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 28, 30, 30, 30, 32, 34, 26, 28, 28, 30, 30, 32, 28, 30, 28, 30, 30, 32, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 14, 22, 18, 22, 24, 26, 16, 22, 18, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 30, 30, 32, 16, 22, 20, 22, 24, 26, 18, 22, 20, 22, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 18, 24, 20, 24, 26, 28, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 30, 32, 32, 32, 34, 36, 28, 30, 30, 32, 32, 34, 30, 32, 30, 32, 32, 34, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 16, 24, 20, 24, 26, 28, 18, 22, 20, 22, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 18, 26, 22, 26, 28, 30, 20, 24, 22, 24, 26, 28, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 20, 24, 22, 24, 26, 28, 22, 26, 22, 24, 26, 28, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 24, 26, 26, 28, 28, 30, 26, 28, 26, 28, 28, 30, 28, 30, 30, 30, 32, 32, 30, 32, 32, 32, 34, 36, 28, 30, 30, 32, 32, 34, 30, 32, 30, 32, 32, 34, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 18, 24, 20, 24, 26, 28, 20, 26, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 28, 30, 30, 30, 32, 34, 20, 26, 22, 26, 28, 30, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 22, 28, 24, 26, 28, 30, 24, 30, 26, 28, 30, 32, 26, 28, 28, 28, 30, 32, 30, 32, 32, 32, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 32, 32, 32, 32, 34, 34, 34, 36, 36, 30, 32, 32, 32, 34, 36, 32, 34, 32, 34, 34, 36, 34, 34, 36, 36, 36, 36, 36, 38, 38, 38, 40, 40, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 30, 32, 32, 32, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 32, 34, 34, 34, 36, 38, 26, 30, 28, 30, 30, 32, 28, 32, 30, 32, 32, 34, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 36, 34, 36, 36, 36, 38, 40, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 38, 38, 36, 36, 38, 38, 38, 38, 38, 40, 40, 40, 42, 42, 28, 30, 30, 32, 32, 34, 30, 32, 30, 32, 32, 34, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 32, 34, 32, 34, 34, 36, 34, 36, 34, 36, 36, 38, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 34, 36, 36, 36, 38, 38, 36, 38, 36, 38, 38, 40, 38, 38, 40, 40, 40, 40, 40, 40, 42, 40, 42, 44, 36, 38, 38, 38, 40, 42, 38, 40, 38, 40, 42, 42, 40, 40, 42, 42, 42, 42, 42, 44, 44, 44, 46, 46, 16, 22, 18, 22, 24, 26, 18, 24, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 18, 24, 20, 24, 26, 28, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 28, 30, 30, 30, 32, 34, 20, 26, 22, 24, 26, 28, 22, 28, 24, 26, 28, 30, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 30, 32, 32, 32, 34, 36, 28, 30, 30, 30, 32, 34, 30, 32, 32, 32, 34, 36, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 40, 18, 24, 20, 24, 26, 28, 20, 26, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 28, 30, 30, 30, 32, 34, 20, 26, 22, 26, 28, 30, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 30, 32, 32, 32, 34, 36, 22, 28, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 26, 28, 28, 28, 30, 32, 30, 32, 32, 32, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 32, 34, 34, 34, 36, 38, 30, 32, 32, 32, 34, 36, 32, 34, 34, 34, 36, 38, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 42, 20, 26, 22, 26, 28, 30, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 30, 32, 32, 32, 34, 36, 22, 28, 24, 28, 30, 32, 24, 28, 26, 28, 30, 32, 26, 28, 28, 30, 30, 32, 30, 32, 32, 34, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 26, 28, 30, 32, 28, 30, 28, 30, 32, 32, 32, 34, 34, 34, 36, 38, 26, 30, 28, 30, 30, 32, 28, 32, 28, 30, 32, 34, 30, 32, 32, 32, 34, 34, 32, 34, 34, 36, 36, 38, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 22, 28, 24, 26, 28, 30, 24, 30, 26, 28, 30, 32, 26, 28, 28, 28, 30, 32, 30, 32, 32, 32, 34, 36, 24, 30, 26, 28, 30, 32, 26, 30, 28, 30, 32, 34, 28, 30, 30, 30, 32, 34, 32, 34, 34, 34, 36, 38, 26, 32, 28, 30, 32, 34, 28, 34, 30, 32, 34, 36, 30, 30, 32, 32, 32, 34, 34, 34, 36, 36, 36, 38, 28, 30, 30, 30, 32, 34, 30, 32, 30, 32, 32, 34, 32, 32, 34, 34, 34, 34, 34, 36, 36, 36, 38, 38, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 32, 34, 34, 34, 36, 38, 26, 30, 28, 30, 32, 34, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 28, 32, 30, 32, 32, 34, 30, 34, 32, 34, 34, 36, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 38, 36, 38, 38, 38, 40, 42, 34, 36, 36, 36, 38, 40, 36, 38, 36, 38, 38, 40, 38, 38, 40, 40, 40, 42, 40, 42, 42, 42, 44, 44, 30, 32, 32, 32, 34, 36, 32, 34, 34, 34, 36, 38, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 42, 32, 34, 34, 34, 36, 38, 34, 36, 36, 36, 38, 40, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 34, 36, 36, 36, 38, 40, 36, 38, 36, 38, 38, 40, 38, 38, 38, 40, 40, 42, 40, 40, 40, 42, 42, 44, 36, 36, 38, 38, 38, 40, 38, 38, 38, 40, 40, 42, 40, 40, 42, 42, 42, 42, 40, 42, 42, 42, 44, 46, 38, 40, 40, 40, 42, 44, 40, 42, 40, 42, 42, 44, 42, 42, 44, 44, 44, 46, 44, 46, 46, 46, 48, 48, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 26, 28, 28, 30, 30, 32, 30, 32, 32, 34, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 32, 34, 34, 34, 36, 38, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 26, 28, 28, 30, 30, 32, 30, 32, 32, 34, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 32, 34, 28, 30, 30, 32, 32, 34, 32, 34, 34, 36, 36, 38, 26, 30, 28, 30, 32, 34, 28, 32, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 34, 36, 36, 36, 38, 40, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 40, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 40, 38, 40, 40, 40, 42, 44, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 32, 34, 28, 30, 30, 32, 32, 34, 32, 34, 34, 36, 36, 38, 26, 30, 28, 30, 32, 34, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 28, 32, 30, 32, 32, 34, 30, 34, 30, 32, 34, 36, 32, 34, 32, 34, 36, 36, 34, 36, 36, 38, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 34, 36, 36, 38, 38, 40, 36, 38, 36, 38, 38, 40, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 26, 30, 28, 30, 32, 34, 28, 32, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 34, 36, 36, 36, 38, 40, 28, 32, 30, 32, 34, 36, 30, 34, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 36, 38, 38, 38, 40, 42, 30, 34, 32, 34, 34, 36, 32, 36, 34, 36, 36, 38, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 42, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 38, 38, 40, 40, 40, 42, 42, 36, 38, 38, 38, 40, 40, 38, 40, 38, 40, 40, 42, 40, 40, 40, 42, 42, 42, 42, 42, 44, 44, 44, 46, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 42, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 40, 38, 38, 40, 40, 40, 42, 34, 36, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 38, 40, 40, 42, 42, 42, 40, 42, 42, 42, 44, 46, 36, 38, 38, 38, 40, 42, 38, 40, 38, 40, 40, 42, 40, 40, 42, 42, 42, 44, 42, 44, 44, 44, 46, 48, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 40, 38, 40, 40, 40, 42, 44, 34, 36, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 36, 38, 38, 40, 40, 42, 38, 40, 38, 40, 40, 42, 40, 40, 40, 42, 42, 44, 42, 42, 42, 44, 44, 46, 38, 40, 40, 40, 42, 42, 40, 42, 40, 42, 44, 44, 42, 42, 44, 44, 44, 44, 44, 44, 46, 44, 46, 48, 40, 42, 42, 42, 44, 46, 42, 44, 42, 44, 44, 46, 44, 44, 46, 46, 46, 48, 46, 48, 48, 48, 50, 52, 30, 30, 30, 30, 30, 34, 30, 32, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 32, 34, 34, 36, 36, 40, 30, 32, 32, 32, 32, 36, 30, 32, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 34, 36, 36, 38, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 42, 32, 34, 34, 34, 36, 38, 34, 36, 36, 36, 38, 40, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 42, 34, 36, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 30, 32, 32, 32, 32, 36, 32, 34, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 34, 36, 36, 38, 38, 42, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 40, 36, 38, 38, 40, 40, 42, 32, 34, 34, 36, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 34, 36, 36, 36, 38, 40, 36, 38, 38, 38, 40, 42, 38, 38, 40, 40, 40, 42, 40, 42, 42, 42, 44, 44, 36, 38, 38, 40, 40, 42, 38, 40, 40, 42, 42, 44, 40, 42, 42, 42, 44, 44, 42, 44, 44, 44, 46, 48, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 40, 36, 38, 38, 40, 40, 42, 32, 34, 34, 36, 36, 38, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 34, 36, 34, 36, 36, 38, 36, 38, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 38, 40, 40, 42, 42, 44, 36, 38, 38, 38, 40, 42, 38, 40, 38, 40, 40, 42, 40, 40, 42, 42, 42, 44, 42, 44, 42, 44, 46, 46, 38, 40, 40, 42, 42, 44, 40, 42, 40, 42, 42, 44, 42, 44, 44, 44, 46, 46, 44, 46, 46, 46, 48, 50, 32, 34, 34, 36, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 34, 36, 36, 38, 38, 40, 36, 38, 36, 38, 38, 40, 38, 38, 40, 40, 40, 42, 40, 42, 42, 42, 44, 46, 36, 38, 36, 38, 38, 40, 38, 40, 38, 40, 40, 42, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 38, 38, 40, 40, 40, 42, 40, 40, 40, 42, 40, 42, 42, 42, 42, 44, 42, 44, 42, 44, 44, 44, 46, 46, 40, 42, 42, 42, 44, 44, 42, 44, 42, 44, 44, 46, 44, 44, 44, 46, 46, 46, 46, 46, 48, 48, 48, 50, 34, 36, 36, 36, 38, 40, 36, 38, 38, 38, 40, 42, 38, 38, 40, 40, 40, 42, 40, 42, 42, 42, 44, 44, 36, 38, 38, 38, 40, 42, 38, 40, 40, 40, 42, 44, 40, 40, 42, 42, 42, 44, 42, 44, 44, 44, 46, 46, 38, 40, 40, 40, 42, 44, 40, 42, 40, 42, 42, 44, 42, 42, 42, 44, 44, 46, 44, 44, 44, 46, 46, 48, 40, 40, 42, 42, 42, 44, 42, 42, 42, 44, 44, 46, 44, 44, 46, 46, 46, 46, 44, 46, 46, 46, 48, 50, 42, 44, 44, 44, 46, 46, 44, 46, 44, 46, 46, 48, 46, 46, 46, 48, 48, 48, 48, 48, 50, 48, 50, 52, 36, 38, 38, 40, 40, 42, 38, 40, 40, 42, 42, 44, 40, 42, 42, 42, 44, 44, 42, 44, 44, 44, 46, 48, 38, 40, 40, 42, 42, 44, 40, 42, 42, 44, 44, 46, 42, 44, 44, 44, 46, 46, 44, 46, 46, 46, 48, 50, 40, 42, 42, 44, 44, 46, 42, 44, 42, 44, 44, 46, 44, 44, 44, 46, 46, 48, 46, 46, 46, 48, 48, 50, 42, 44, 44, 44, 46, 46, 44, 46, 44, 46, 48, 48, 46, 46, 48, 48, 48, 48, 48, 48, 50, 48, 50, 52, 44, 46, 46, 46, 48, 50, 46, 48, 46, 48, 48, 50, 48, 48, 50, 50, 50, 52, 50, 52, 52, 52, 54, 56, 
  • 打表提交结果
/* **********************************************

  File Name: test.cpp

  Auther: zhengdongjian@tju.edu.cn

  Created Time: 2015年09月27日 星期日 18时00分09秒

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

typedef long long ll;
typedef pair<int, int> P;

int tab[8][6400] = {
    {0},
    {0, -1},
    {0, 12, 4, 8, 16, 20},
    {0, 12, 4, 8, 16, 18, 4, 10, 6, 10, 12, 14, 8, 12, 10, 12, 14, 16, 18, 18, 18, 18, 18, 22},
    {0, 12, 4, 8, 16, 18, 4, 10, 6, 10, 12, 14, 8, 12, 10, 12, 14, 16, 18, 18, 18, 18, 18, 22, 4, 12, 8, 12, 14, 16, 6, 12, 8, 12, 14, 16, 10, 14, 12, 14, 16, 18, 16, 18, 18, 20, 20, 22, 8, 14, 10, 14, 16, 18, 10, 16, 12, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 20, 22, 24, 12, 16, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 22, 22, 22, 22, 22, 26, 22, 24, 22, 24, 24, 26, 22, 24, 24, 24, 26, 28, 24, 26, 26, 28, 28, 32},
    {0, 12, 4, 8, 16, 18, 4, 10, 6, 10, 12, 14, 8, 12, 10, 12, 14, 16, 18, 18, 18, 18, 18, 22, 4, 12, 8, 12, 14, 16, 6, 12, 8, 12, 14, 16, 10, 14, 12, 14, 16, 18, 16, 18, 18, 20, 20, 22, 8, 14, 10, 14, 16, 18, 10, 16, 12, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 20, 22, 24, 12, 16, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 22, 22, 22, 22, 22, 26, 22, 24, 22, 24, 24, 26, 22, 24, 24, 24, 26, 28, 24, 26, 26, 28, 28, 32, 4, 14, 8, 12, 16, 18, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 22, 22, 24, 6, 14, 10, 14, 16, 18, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 22, 22, 24, 10, 16, 12, 16, 18, 20, 12, 18, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 22, 24, 26, 14, 18, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 18, 20, 20, 22, 22, 24, 22, 24, 24, 26, 26, 28, 20, 22, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 24, 26, 26, 26, 28, 30, 26, 28, 28, 30, 30, 32, 8, 16, 12, 16, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 10, 18, 14, 18, 20, 22, 12, 16, 14, 16, 18, 20, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 22, 24, 20, 22, 22, 24, 24, 26, 24, 26, 26, 26, 28, 30, 22, 24, 24, 26, 26, 28, 24, 26, 24, 26, 26, 28, 26, 28, 28, 28, 30, 30, 28, 30, 30, 30, 32, 34, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 14, 20, 16, 20, 22, 24, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 16, 22, 18, 20, 22, 24, 18, 24, 20, 22, 24, 26, 20, 22, 22, 22, 24, 26, 24, 26, 26, 26, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 28, 30, 32, 24, 26, 26, 26, 28, 30, 26, 28, 28, 28, 30, 32, 28, 28, 30, 30, 30, 32, 30, 32, 32, 32, 34, 36, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 26, 26, 26, 26, 26, 30, 26, 28, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 28, 30, 30, 32, 32, 36, 26, 28, 28, 28, 28, 32, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 30, 32, 32, 34, 34, 36, 26, 28, 28, 30, 30, 32, 28, 30, 28, 30, 30, 32, 30, 30, 32, 32, 32, 34, 32, 34, 34, 34, 36, 38, 28, 30, 30, 30, 32, 34, 30, 32, 32, 32, 34, 36, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 38, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42},
    {0, 12, 4, 8, 16, 18, 4, 10, 6, 10, 12, 14, 8, 12, 10, 12, 14, 16, 18, 18, 18, 18, 18, 22, 4, 12, 8, 12, 14, 16, 6, 12, 8, 12, 14, 16, 10, 14, 12, 14, 16, 18, 16, 18, 18, 20, 20, 22, 8, 14, 10, 14, 16, 18, 10, 16, 12, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 20, 22, 24, 12, 16, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 22, 22, 22, 22, 22, 26, 22, 24, 22, 24, 24, 26, 22, 24, 24, 24, 26, 28, 24, 26, 26, 28, 28, 32, 4, 14, 8, 12, 16, 18, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 22, 22, 24, 6, 14, 10, 14, 16, 18, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 18, 20, 20, 22, 22, 24, 10, 16, 12, 16, 18, 20, 12, 18, 14, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 22, 24, 26, 14, 18, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 18, 20, 20, 22, 22, 24, 22, 24, 24, 26, 26, 28, 20, 22, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 24, 26, 26, 26, 28, 30, 26, 28, 28, 30, 30, 32, 8, 16, 12, 16, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 10, 18, 14, 18, 20, 22, 12, 16, 14, 16, 18, 20, 16, 18, 18, 20, 20, 22, 20, 22, 22, 24, 24, 26, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 22, 24, 20, 22, 22, 24, 24, 26, 24, 26, 26, 26, 28, 30, 22, 24, 24, 26, 26, 28, 24, 26, 24, 26, 26, 28, 26, 28, 28, 28, 30, 30, 28, 30, 30, 30, 32, 34, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 14, 20, 16, 20, 22, 24, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 16, 22, 18, 20, 22, 24, 18, 24, 20, 22, 24, 26, 20, 22, 22, 22, 24, 26, 24, 26, 26, 26, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 28, 30, 32, 24, 26, 26, 26, 28, 30, 26, 28, 28, 28, 30, 32, 28, 28, 30, 30, 30, 32, 30, 32, 32, 32, 34, 36, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 26, 26, 26, 26, 26, 30, 26, 28, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 28, 30, 30, 32, 32, 36, 26, 28, 28, 28, 28, 32, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 30, 32, 32, 34, 34, 36, 26, 28, 28, 30, 30, 32, 28, 30, 28, 30, 30, 32, 30, 30, 32, 32, 32, 34, 32, 34, 34, 34, 36, 38, 28, 30, 30, 30, 32, 34, 30, 32, 32, 32, 34, 36, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 38, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 4, 16, 8, 12, 18, 20, 8, 14, 10, 14, 16, 18, 12, 16, 14, 16, 18, 20, 20, 22, 22, 22, 22, 26, 8, 16, 12, 16, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 28, 30, 30, 32, 32, 34, 6, 16, 10, 14, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 8, 16, 12, 16, 18, 20, 10, 16, 12, 16, 18, 20, 14, 18, 16, 18, 20, 22, 20, 22, 22, 24, 24, 26, 12, 18, 14, 18, 20, 22, 14, 20, 16, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 24, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 28, 30, 30, 32, 32, 34, 10, 18, 14, 18, 20, 22, 12, 18, 14, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 26, 26, 28, 12, 20, 16, 20, 22, 24, 14, 18, 16, 18, 20, 22, 18, 20, 20, 22, 22, 24, 22, 24, 24, 26, 26, 28, 14, 20, 16, 20, 22, 24, 16, 22, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 28, 30, 32, 24, 26, 26, 28, 28, 30, 26, 28, 26, 28, 28, 30, 28, 30, 30, 30, 32, 32, 30, 32, 32, 32, 34, 36, 14, 20, 16, 20, 22, 24, 16, 22, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 16, 22, 18, 22, 24, 26, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 18, 24, 20, 22, 24, 26, 20, 26, 22, 24, 26, 28, 22, 24, 24, 24, 26, 28, 26, 28, 28, 28, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 28, 30, 30, 30, 32, 34, 26, 28, 28, 28, 30, 32, 28, 30, 30, 30, 32, 34, 30, 30, 32, 32, 32, 34, 32, 34, 34, 34, 36, 38, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 28, 30, 32, 30, 32, 32, 32, 34, 36, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 30, 32, 32, 34, 34, 36, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 32, 34, 34, 36, 36, 38, 28, 30, 30, 32, 32, 34, 30, 32, 30, 32, 32, 34, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 40, 30, 32, 32, 32, 34, 36, 32, 34, 34, 34, 36, 38, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 40, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 40, 38, 40, 40, 40, 42, 44, 8, 18, 12, 16, 20, 22, 12, 18, 14, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 26, 26, 28, 10, 18, 14, 18, 20, 22, 12, 18, 14, 18, 20, 22, 16, 20, 18, 20, 22, 24, 22, 24, 24, 26, 26, 28, 14, 20, 16, 20, 22, 24, 16, 22, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 26, 28, 30, 18, 22, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 30, 32, 32, 34, 34, 36, 10, 20, 14, 18, 22, 24, 14, 20, 16, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 28, 28, 30, 12, 18, 16, 18, 20, 22, 14, 18, 16, 18, 20, 22, 18, 20, 20, 22, 22, 24, 22, 24, 24, 26, 26, 28, 16, 20, 18, 20, 22, 24, 18, 22, 20, 22, 24, 26, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 20, 22, 22, 24, 24, 26, 22, 24, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 12, 20, 16, 20, 22, 24, 14, 20, 16, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 28, 28, 30, 14, 22, 18, 22, 24, 26, 16, 20, 18, 20, 22, 24, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 16, 22, 18, 22, 24, 26, 18, 24, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 28, 30, 30, 30, 32, 34, 26, 28, 28, 30, 30, 32, 28, 30, 28, 30, 30, 32, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 16, 22, 18, 22, 24, 26, 18, 24, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 18, 24, 20, 24, 26, 28, 20, 24, 22, 24, 26, 28, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 20, 26, 22, 24, 26, 28, 22, 28, 24, 26, 28, 30, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 30, 32, 32, 32, 34, 36, 28, 30, 30, 30, 32, 34, 30, 32, 30, 32, 32, 34, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 40, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 32, 34, 32, 34, 36, 36, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 32, 34, 34, 36, 36, 38, 28, 30, 30, 32, 32, 34, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 34, 34, 36, 36, 38, 36, 38, 36, 38, 40, 40, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 38, 40, 42, 42, 34, 36, 36, 38, 38, 40, 36, 38, 36, 38, 38, 40, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 12, 20, 16, 20, 22, 24, 14, 20, 16, 20, 22, 24, 18, 22, 20, 22, 24, 26, 24, 26, 26, 28, 28, 30, 14, 22, 18, 22, 24, 26, 16, 20, 18, 20, 22, 24, 20, 22, 22, 24, 24, 26, 24, 26, 26, 28, 28, 30, 16, 22, 18, 22, 24, 26, 18, 24, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 26, 28, 24, 26, 26, 28, 28, 30, 28, 30, 30, 30, 32, 34, 26, 28, 28, 30, 30, 32, 28, 30, 28, 30, 30, 32, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 14, 22, 18, 22, 24, 26, 16, 22, 18, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 30, 30, 32, 16, 22, 20, 22, 24, 26, 18, 22, 20, 22, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 18, 24, 20, 24, 26, 28, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 30, 32, 32, 32, 34, 36, 28, 30, 30, 32, 32, 34, 30, 32, 30, 32, 32, 34, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 16, 24, 20, 24, 26, 28, 18, 22, 20, 22, 24, 26, 22, 24, 24, 26, 26, 28, 26, 28, 28, 30, 30, 32, 18, 26, 22, 26, 28, 30, 20, 24, 22, 24, 26, 28, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 20, 24, 22, 24, 26, 28, 22, 26, 22, 24, 26, 28, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 24, 26, 26, 28, 28, 30, 26, 28, 26, 28, 28, 30, 28, 30, 30, 30, 32, 32, 30, 32, 32, 32, 34, 36, 28, 30, 30, 32, 32, 34, 30, 32, 30, 32, 32, 34, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 18, 24, 20, 24, 26, 28, 20, 26, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 28, 30, 30, 30, 32, 34, 20, 26, 22, 26, 28, 30, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 22, 28, 24, 26, 28, 30, 24, 30, 26, 28, 30, 32, 26, 28, 28, 28, 30, 32, 30, 32, 32, 32, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 32, 32, 32, 32, 34, 34, 34, 36, 36, 30, 32, 32, 32, 34, 36, 32, 34, 32, 34, 34, 36, 34, 34, 36, 36, 36, 36, 36, 38, 38, 38, 40, 40, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 30, 32, 32, 32, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 32, 34, 34, 34, 36, 38, 26, 30, 28, 30, 30, 32, 28, 32, 30, 32, 32, 34, 30, 32, 32, 32, 34, 34, 32, 34, 34, 34, 36, 38, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 36, 34, 36, 36, 36, 38, 40, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 38, 38, 36, 36, 38, 38, 38, 38, 38, 40, 40, 40, 42, 42, 28, 30, 30, 32, 32, 34, 30, 32, 30, 32, 32, 34, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 32, 34, 32, 34, 34, 36, 34, 36, 34, 36, 36, 38, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 34, 36, 36, 36, 38, 38, 36, 38, 36, 38, 38, 40, 38, 38, 40, 40, 40, 40, 40, 40, 42, 40, 42, 44, 36, 38, 38, 38, 40, 42, 38, 40, 38, 40, 42, 42, 40, 40, 42, 42, 42, 42, 42, 44, 44, 44, 46, 46, 16, 22, 18, 22, 24, 26, 18, 24, 20, 22, 24, 26, 20, 24, 22, 24, 26, 28, 26, 28, 28, 28, 30, 32, 18, 24, 20, 24, 26, 28, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 28, 30, 30, 30, 32, 34, 20, 26, 22, 24, 26, 28, 22, 28, 24, 26, 28, 30, 24, 26, 26, 26, 28, 30, 28, 30, 30, 30, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 28, 30, 26, 28, 28, 30, 30, 32, 30, 32, 32, 32, 34, 36, 28, 30, 30, 30, 32, 34, 30, 32, 32, 32, 34, 36, 32, 32, 34, 34, 34, 36, 34, 36, 36, 36, 38, 40, 18, 24, 20, 24, 26, 28, 20, 26, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 28, 30, 30, 30, 32, 34, 20, 26, 22, 26, 28, 30, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 30, 32, 32, 32, 34, 36, 22, 28, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 26, 28, 28, 28, 30, 32, 30, 32, 32, 32, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 32, 34, 34, 34, 36, 38, 30, 32, 32, 32, 34, 36, 32, 34, 34, 34, 36, 38, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 42, 20, 26, 22, 26, 28, 30, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 30, 32, 32, 32, 34, 36, 22, 28, 24, 28, 30, 32, 24, 28, 26, 28, 30, 32, 26, 28, 28, 30, 30, 32, 30, 32, 32, 34, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 26, 28, 30, 32, 28, 30, 28, 30, 32, 32, 32, 34, 34, 34, 36, 38, 26, 30, 28, 30, 30, 32, 28, 32, 28, 30, 32, 34, 30, 32, 32, 32, 34, 34, 32, 34, 34, 36, 36, 38, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 22, 28, 24, 26, 28, 30, 24, 30, 26, 28, 30, 32, 26, 28, 28, 28, 30, 32, 30, 32, 32, 32, 34, 36, 24, 30, 26, 28, 30, 32, 26, 30, 28, 30, 32, 34, 28, 30, 30, 30, 32, 34, 32, 34, 34, 34, 36, 38, 26, 32, 28, 30, 32, 34, 28, 34, 30, 32, 34, 36, 30, 30, 32, 32, 32, 34, 34, 34, 36, 36, 36, 38, 28, 30, 30, 30, 32, 34, 30, 32, 30, 32, 32, 34, 32, 32, 34, 34, 34, 34, 34, 36, 36, 36, 38, 38, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 32, 34, 34, 34, 36, 38, 26, 30, 28, 30, 32, 34, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 28, 32, 30, 32, 32, 34, 30, 34, 32, 34, 34, 36, 32, 34, 34, 34, 36, 36, 34, 36, 36, 36, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 38, 36, 38, 38, 38, 40, 42, 34, 36, 36, 36, 38, 40, 36, 38, 36, 38, 38, 40, 38, 38, 40, 40, 40, 42, 40, 42, 42, 42, 44, 44, 30, 32, 32, 32, 34, 36, 32, 34, 34, 34, 36, 38, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 42, 32, 34, 34, 34, 36, 38, 34, 36, 36, 36, 38, 40, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 34, 36, 36, 36, 38, 40, 36, 38, 36, 38, 38, 40, 38, 38, 38, 40, 40, 42, 40, 40, 40, 42, 42, 44, 36, 36, 38, 38, 38, 40, 38, 38, 38, 40, 40, 42, 40, 40, 42, 42, 42, 42, 40, 42, 42, 42, 44, 46, 38, 40, 40, 40, 42, 44, 40, 42, 40, 42, 42, 44, 42, 42, 44, 44, 44, 46, 44, 46, 46, 46, 48, 48, 20, 24, 22, 24, 26, 28, 22, 26, 24, 26, 28, 30, 24, 26, 26, 28, 28, 30, 28, 30, 30, 32, 32, 34, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 26, 28, 28, 30, 30, 32, 30, 32, 32, 34, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 30, 32, 28, 30, 30, 30, 32, 34, 32, 34, 34, 34, 36, 38, 26, 28, 28, 30, 30, 32, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 22, 26, 24, 26, 28, 30, 24, 28, 26, 28, 30, 32, 26, 28, 28, 30, 30, 32, 30, 32, 32, 34, 34, 36, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 32, 34, 28, 30, 30, 32, 32, 34, 32, 34, 34, 36, 36, 38, 26, 30, 28, 30, 32, 34, 28, 32, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 34, 36, 36, 36, 38, 40, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 40, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 40, 38, 40, 40, 40, 42, 44, 24, 28, 26, 28, 30, 32, 26, 30, 28, 30, 32, 34, 28, 30, 30, 32, 32, 34, 32, 34, 34, 36, 36, 38, 26, 30, 28, 30, 32, 34, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 28, 32, 30, 32, 32, 34, 30, 34, 30, 32, 34, 36, 32, 34, 32, 34, 36, 36, 34, 36, 36, 38, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 36, 36, 36, 38, 38, 36, 38, 38, 38, 40, 42, 34, 36, 36, 38, 38, 40, 36, 38, 36, 38, 38, 40, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 26, 30, 28, 30, 32, 34, 28, 32, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 34, 36, 36, 36, 38, 40, 28, 32, 30, 32, 34, 36, 30, 34, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 36, 38, 38, 38, 40, 42, 30, 34, 32, 34, 34, 36, 32, 36, 34, 36, 36, 38, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 42, 32, 34, 34, 34, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 38, 38, 40, 40, 40, 42, 42, 36, 38, 38, 38, 40, 40, 38, 40, 38, 40, 40, 42, 40, 40, 40, 42, 42, 42, 42, 42, 44, 44, 44, 46, 28, 30, 30, 32, 32, 34, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 42, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 40, 38, 38, 40, 40, 40, 42, 34, 36, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 38, 40, 40, 42, 42, 42, 40, 42, 42, 42, 44, 46, 36, 38, 38, 38, 40, 42, 38, 40, 38, 40, 40, 42, 40, 40, 42, 42, 42, 44, 42, 44, 44, 44, 46, 48, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 38, 40, 40, 38, 40, 40, 40, 42, 44, 34, 36, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 36, 38, 38, 40, 40, 42, 38, 40, 38, 40, 40, 42, 40, 40, 40, 42, 42, 44, 42, 42, 42, 44, 44, 46, 38, 40, 40, 40, 42, 42, 40, 42, 40, 42, 44, 44, 42, 42, 44, 44, 44, 44, 44, 44, 46, 44, 46, 48, 40, 42, 42, 42, 44, 46, 42, 44, 42, 44, 44, 46, 44, 44, 46, 46, 46, 48, 46, 48, 48, 48, 50, 52, 30, 30, 30, 30, 30, 34, 30, 32, 30, 32, 32, 34, 30, 32, 32, 32, 34, 36, 32, 34, 34, 36, 36, 40, 30, 32, 32, 32, 32, 36, 30, 32, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 34, 36, 36, 38, 38, 40, 30, 32, 32, 34, 34, 36, 32, 34, 32, 34, 34, 36, 34, 34, 36, 36, 36, 38, 36, 38, 38, 38, 40, 42, 32, 34, 34, 34, 36, 38, 34, 36, 36, 36, 38, 40, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 42, 34, 36, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 30, 32, 32, 32, 32, 36, 32, 34, 32, 34, 34, 36, 32, 34, 34, 34, 36, 38, 34, 36, 36, 38, 38, 42, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 40, 36, 38, 38, 40, 40, 42, 32, 34, 34, 36, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 34, 36, 36, 36, 38, 40, 36, 38, 38, 38, 40, 42, 38, 38, 40, 40, 40, 42, 40, 42, 42, 42, 44, 44, 36, 38, 38, 40, 40, 42, 38, 40, 40, 42, 42, 44, 40, 42, 42, 42, 44, 44, 42, 44, 44, 44, 46, 48, 30, 32, 32, 34, 34, 36, 32, 34, 34, 36, 36, 38, 34, 36, 36, 36, 38, 40, 36, 38, 38, 40, 40, 42, 32, 34, 34, 36, 36, 38, 32, 34, 34, 36, 36, 38, 34, 36, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 34, 36, 34, 36, 36, 38, 36, 38, 36, 38, 38, 40, 36, 38, 38, 40, 40, 42, 38, 40, 40, 42, 42, 44, 36, 38, 38, 38, 40, 42, 38, 40, 38, 40, 40, 42, 40, 40, 42, 42, 42, 44, 42, 44, 42, 44, 46, 46, 38, 40, 40, 42, 42, 44, 40, 42, 40, 42, 42, 44, 42, 44, 44, 44, 46, 46, 44, 46, 46, 46, 48, 50, 32, 34, 34, 36, 36, 38, 34, 36, 34, 36, 36, 38, 36, 36, 38, 38, 38, 40, 38, 40, 40, 40, 42, 44, 34, 36, 36, 38, 38, 40, 36, 38, 36, 38, 38, 40, 38, 38, 40, 40, 40, 42, 40, 42, 42, 42, 44, 46, 36, 38, 36, 38, 38, 40, 38, 40, 38, 40, 40, 42, 38, 40, 40, 40, 42, 42, 40, 42, 42, 42, 44, 46, 38, 38, 40, 40, 40, 42, 40, 40, 40, 42, 40, 42, 42, 42, 42, 44, 42, 44, 42, 44, 44, 44, 46, 46, 40, 42, 42, 42, 44, 44, 42, 44, 42, 44, 44, 46, 44, 44, 44, 46, 46, 46, 46, 46, 48, 48, 48, 50, 34, 36, 36, 36, 38, 40, 36, 38, 38, 38, 40, 42, 38, 38, 40, 40, 40, 42, 40, 42, 42, 42, 44, 44, 36, 38, 38, 38, 40, 42, 38, 40, 40, 40, 42, 44, 40, 40, 42, 42, 42, 44, 42, 44, 44, 44, 46, 46, 38, 40, 40, 40, 42, 44, 40, 42, 40, 42, 42, 44, 42, 42, 42, 44, 44, 46, 44, 44, 44, 46, 46, 48, 40, 40, 42, 42, 42, 44, 42, 42, 42, 44, 44, 46, 44, 44, 46, 46, 46, 46, 44, 46, 46, 46, 48, 50, 42, 44, 44, 44, 46, 46, 44, 46, 44, 46, 46, 48, 46, 46, 46, 48, 48, 48, 48, 48, 50, 48, 50, 52, 36, 38, 38, 40, 40, 42, 38, 40, 40, 42, 42, 44, 40, 42, 42, 42, 44, 44, 42, 44, 44, 44, 46, 48, 38, 40, 40, 42, 42, 44, 40, 42, 42, 44, 44, 46, 42, 44, 44, 44, 46, 46, 44, 46, 46, 46, 48, 50, 40, 42, 42, 44, 44, 46, 42, 44, 42, 44, 44, 46, 44, 44, 44, 46, 46, 48, 46, 46, 46, 48, 48, 50, 42, 44, 44, 44, 46, 46, 44, 46, 44, 46, 48, 48, 46, 46, 48, 48, 48, 48, 48, 48, 50, 48, 50, 52, 44, 46, 46, 46, 48, 50, 46, 48, 46, 48, 48, 50, 48, 48, 50, 50, 50, 52, 50, 52, 52, 52, 54, 56}
};

/*************************Cantor expansion***************************/
const int CACNTOR_MAX = 13;
int fac[CACNTOR_MAX] = {
    1, 1, 2, 6, 24, 120,
    720, 5040, 40320, 362880,
    3628800, 39916800, 479001600
}; //fac list, fac[i] = i!, fac[max] = fac[12] = 479 001 600

//将x解压,存在a[]中,长度bit。
//返回: 数字0的位置
int decode(int a[], int bit, int x) {
    bool tmp[CACNTOR_MAX] = {0};

    int res;
    for (int i = 0; i < bit; ++i) {
        a[i] = x / fac[bit - i - 1];
        x %= fac[bit - i - 1];
        int j = 1;
        for (int l = 0; l <= a[i]; ++j)
            if (!tmp[j]) ++l;
        tmp[--j] = true;
        a[i] = j - 1;
        if (j == 1) res = i;
    }
    return res;
}

//use [0, 1, 2, ..., bit-1] or [1, 2, ..., bit]
//it all works.
int encode(int a[], int bit) {
    int s = 0;
    for (int i = 0; i < bit; ++i) {
        int c = 0;
        for (int j = i + 1; j < bit; ++j) {
            c += a[j] < a[i];
        }
        s += c * fac[bit-i-1];
    }
    return s;
}
/********************************************************************/

int a[8];
int b[8];

int main() {
    int T, n;
    scanf(" %d", &T);
    while (T--) {
        scanf(" %d", &n);
        for (int i = 0; i < n; ++i) {
            scanf(" %d", a + i);
        }
        memcpy(b, a, sizeof(a));
        sort(b, b + n);
        for (int i = 0; i < n; ++i) {
            a[i] = lower_bound(b, b + n, a[i]) - b;
            //printf("a[%d] = %d\n", i, a[i]);
        }
        printf("%d\n", tab[n - 1][encode(a, n)]);
    }
    return 0;
}
  • 状态压缩 BFS O(2n)
/* **********************************************

  File Name: 1233.cpp

  Auther: zhengdongjian@tju.edu.cn

  Created Time: 2015年09月27日 星期日 19时03分36秒

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

typedef pair<int, int> P;
const int MAX = 7;
const int MAX_S = 3 * MAX;

int dp[MAX][1 << MAX_S];
bool vis[1 << MAX_S];
int len, len3;
int a[MAX], b[MAX];

void decode(int state) {
    memset(b, -1, sizeof(b));
    for (int i = 0; i < len; ++i) {
        int tp = state & 7;
        state >>= 3;
        if (~b[tp]) {
            continue;
        }
        b[tp] = i;
    }
}

void print(int x) {
    stack<char> s;
    for (int i = 0; i < len3; ++i) {
        s.push((x & 1) + '0');
        x >>= 1;
    }
    while (!s.empty()) {
        putchar(s.top());
        s.pop();
    }
}

void bfs(int start) {
    memset(vis, false, sizeof(vis));
    queue<P> Q;
    Q.push(P(start, 0));
    P now, nxt;
    while (!Q.empty()) {
        now = Q.front();
        Q.pop();
        if (dp[len - 1][now.first] == -1) dp[len - 1][now.first] = now.second;
        decode(now.first);
        for (int i = 0; i < len; ++i) {
            //printf("i = %d\n", i);
            if (i > 0) {
                if (b[i] != -1 && (b[i - 1] == -1 || b[i] < b[i - 1])) {
                    //move b[i] to i - 1
                    nxt.first = (now.first & (~(7 << (3 * b[i])))) | ((i - 1) << (3 * b[i]));
                    nxt.second = now.second + 1;
                    if (!vis[nxt.first]) {
                        vis[nxt.first] = true;
                        Q.push(nxt);
                    }
                }
            }
            if (i + 1 < len) {
                if (b[i] != -1 && (b[i + 1] == -1 || b[i] < b[i + 1])) {
                    //move a[i] to i + 1
                    nxt.first = (now.first & (~(7 << (3 * b[i])))) | ((i + 1) << (3 * b[i]));
                    nxt.second = now.second + 1;
                    if (!vis[nxt.first]) {
                        vis[nxt.first] = true;
                        Q.push(nxt);
                    }
                }
            }
        }
    }
}

int main() {
    memset(dp, -1, sizeof(dp));
    for (len = 1; len <= MAX; ++len) {
        len3 = len * 3;
        int start = 0;
        for (int i = len - 1; i >= 0; --i) {
            start <<= 3;
            start |= i;
        }
        bfs(start);
    }

    int T, n;
    scanf(" %d", &T);
    while (T--) {
        scanf(" %d", &n);
        for (int i = 0; i < n; ++i) {
            scanf(" %d", a + i);
        }
        memcpy(b, a, sizeof(a));
        sort(b, b + n);
        for (int i = 0; i < n; ++i) {
            a[i] = lower_bound(b, b + n, a[i]) - b;
        }
        for (int i = 0; i < n; ++i) {
            b[a[i]] = i;
        }
        int start = 0;
        for (int i = n - 1; i >= 0; --i) {
            start <<= 3;
            start |= b[i];
        }
        printf("%d\n", dp[n - 1][start]);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值