#include <iostream>
#include <set>
#include <array>
#include <algorithm>
#include <vector>
using namespace std;
const size_t N = 8;
typedef array<size_t, N> perm;
typedef set<perm> perms;
perms s;
void init (perms& s) {
s.clear();
perm ta;
for (size_t i = 0; i < N; ++i) ta[i] = i+1;
s.insert(ta);
while(next_permutation(ta.begin(), ta.end()))
s.insert(ta);
}
size_t sieve (perms& s, pair<size_t, size_t> p) {
vector<perm> for_insert;
vector<perms::iterator> for_erase;
for (auto sit = s.begin(); sit != s.end(); ++sit) {
auto first = p.first - 1;
auto second = p.second - 1;
if ((*sit)[first] > (*sit)[second]) {
for_erase.push_back(sit);
for_insert.push_back(*sit);
swap(for_insert.back()[first], for_insert.back()[second]);
}
}
for (auto& eit: for_erase)
s.erase(eit);
for (auto& a: for_insert) {
bool t = s.insert(a).second;
//if (t) cout << "INSERT!" << endl;
}
return s.size();
}
void show (const perms& s) {
cout << s.size() << " total:" << endl;
for (auto& a: s) {
for (auto& e: a) cout << e;
cout << endl;
}
}
int main() {
init(s);
cout << s.size() << endl;
cout << sieve(s, {1, 5}) << endl;
cout << sieve(s, {2, 6}) << endl;
cout << sieve(s, {3, 7}) << endl;
cout << sieve(s, {4, 8}) << endl;
cout << sieve(s, {1, 2}) << endl;
cout << sieve(s, {3, 4}) << endl;
cout << sieve(s, {5, 6}) << endl;
cout << sieve(s, {7, 8}) << endl;
cout << sieve(s, {1, 3}) << endl;
cout << sieve(s, {6, 8}) << endl;
cout << sieve(s, {2, 7}) << endl;
cout << sieve(s, {4, 5}) << endl;
cout << sieve(s, {2, 3}) << endl;
cout << sieve(s, {2, 4}) << endl;
cout << sieve(s, {5, 7}) << endl;
cout << sieve(s, {6, 7}) << endl;
cout << sieve(s, {3, 4}) << endl;
cout << sieve(s, {5, 6}) << endl;
cout << sieve(s, {4, 5}) << endl;
show(s);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBzaXplX3QgTiA9IDg7CnR5cGVkZWYgYXJyYXk8c2l6ZV90LCBOPiBwZXJtOwp0eXBlZGVmIHNldDxwZXJtPiBwZXJtczsKCnBlcm1zIHM7Cgp2b2lkIGluaXQgKHBlcm1zJiBzKSB7CglzLmNsZWFyKCk7CglwZXJtIHRhOwoJZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOOyArK2kpIHRhW2ldID0gaSsxOwoJcy5pbnNlcnQodGEpOwoJd2hpbGUobmV4dF9wZXJtdXRhdGlvbih0YS5iZWdpbigpLCB0YS5lbmQoKSkpCgkJcy5pbnNlcnQodGEpOwp9CgpzaXplX3Qgc2lldmUgKHBlcm1zJiBzLCBwYWlyPHNpemVfdCwgc2l6ZV90PiBwKSB7Cgl2ZWN0b3I8cGVybT4gZm9yX2luc2VydDsKCXZlY3RvcjxwZXJtczo6aXRlcmF0b3I+IGZvcl9lcmFzZTsKCQoJZm9yIChhdXRvIHNpdCA9IHMuYmVnaW4oKTsgc2l0ICE9IHMuZW5kKCk7ICsrc2l0KSB7CgkJYXV0byBmaXJzdCA9IHAuZmlyc3QgLSAxOwoJCWF1dG8gc2Vjb25kID0gcC5zZWNvbmQgLSAxOwoJCWlmICgoKnNpdClbZmlyc3RdID4gKCpzaXQpW3NlY29uZF0pIHsKCQkJZm9yX2VyYXNlLnB1c2hfYmFjayhzaXQpOwoJCQlmb3JfaW5zZXJ0LnB1c2hfYmFjaygqc2l0KTsKCQkJc3dhcChmb3JfaW5zZXJ0LmJhY2soKVtmaXJzdF0sIGZvcl9pbnNlcnQuYmFjaygpW3NlY29uZF0pOwoJCX0KCX0KCQoJZm9yIChhdXRvJiBlaXQ6IGZvcl9lcmFzZSkKCQlzLmVyYXNlKGVpdCk7CgkJCglmb3IgKGF1dG8mIGE6IGZvcl9pbnNlcnQpIHsKCQlib29sIHQgPSBzLmluc2VydChhKS5zZWNvbmQ7CgkJLy9pZiAodCkgY291dCA8PCAiSU5TRVJUISIgPDwgZW5kbDsJCQoJfQoJCglyZXR1cm4gcy5zaXplKCk7Cn0KCnZvaWQgc2hvdyAoY29uc3QgcGVybXMmIHMpIHsKCWNvdXQgPDwgcy5zaXplKCkgPDwgICIgdG90YWw6IiA8PCBlbmRsOwoJZm9yIChhdXRvJiBhOiBzKSB7CgkJZm9yIChhdXRvJiBlOiBhKSBjb3V0IDw8IGU7CgkJY291dCA8PCBlbmRsOwoJfQp9CgppbnQgbWFpbigpIHsKCWluaXQocyk7Cgljb3V0IDw8IHMuc2l6ZSgpIDw8IGVuZGw7CgkKCWNvdXQgPDwgc2lldmUocywgezEsIDV9KSA8PCBlbmRsOwoJY291dCA8PCBzaWV2ZShzLCB7MiwgNn0pIDw8IGVuZGw7Cgljb3V0IDw8IHNpZXZlKHMsIHszLCA3fSkgPDwgZW5kbDsKCWNvdXQgPDwgc2lldmUocywgezQsIDh9KSA8PCBlbmRsOwoJY291dCA8PCBzaWV2ZShzLCB7MSwgMn0pIDw8IGVuZGw7Cgljb3V0IDw8IHNpZXZlKHMsIHszLCA0fSkgPDwgZW5kbDsKCWNvdXQgPDwgc2lldmUocywgezUsIDZ9KSA8PCBlbmRsOwoJY291dCA8PCBzaWV2ZShzLCB7NywgOH0pIDw8IGVuZGw7Cgljb3V0IDw8IHNpZXZlKHMsIHsxLCAzfSkgPDwgZW5kbDsKCWNvdXQgPDwgc2lldmUocywgezYsIDh9KSA8PCBlbmRsOwogICAgY291dCA8PCBzaWV2ZShzLCB7MiwgN30pIDw8IGVuZGw7CiAgICBjb3V0IDw8IHNpZXZlKHMsIHs0LCA1fSkgPDwgZW5kbDsKICAgIGNvdXQgPDwgc2lldmUocywgezIsIDN9KSA8PCBlbmRsOwogICAgY291dCA8PCBzaWV2ZShzLCB7MiwgNH0pIDw8IGVuZGw7CiAgICBjb3V0IDw8IHNpZXZlKHMsIHs1LCA3fSkgPDwgZW5kbDsKICAgIGNvdXQgPDwgc2lldmUocywgezYsIDd9KSA8PCBlbmRsOwogICAgY291dCA8PCBzaWV2ZShzLCB7MywgNH0pIDw8IGVuZGw7CiAgICBjb3V0IDw8IHNpZXZlKHMsIHs1LCA2fSkgPDwgZW5kbDsKICAgIGNvdXQgPDwgc2lldmUocywgezQsIDV9KSA8PCBlbmRsOwoKCgoKCXNob3cocyk7CgkKICAgIHJldHVybiAwOwp9Cg==