#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
bool is_valid_placement(const auto& cur, const auto& end) {
size_t n = distance(cur, end);
vector<uint32_t> diag_1(2 * n + 1, 0),
diag_2(2 * n + 1, 0);
size_t row_index = 1;
for_each(cur, end, [&](uint64_t row) {
diag_1[__builtin_ctzll(row) + 1 + row_index] ++;
diag_2[__builtin_ctzll(row) + 1 - row_index + n] ++;
row_index ++;
});
return *max_element(diag_1.cbegin(), diag_1.cend()) == 1 &&
*max_element(diag_2.cbegin(), diag_2.cend()) == 1;
}
int main() {
size_t n;
cin >> n;
vector<uint64_t> board(n);
iota(board.begin(), board.end(), 0);
for_each(board.begin(), board.end(), [](uint64_t& row) { row = uint64_t(1) << row; });
size_t answer = 0;
do {
if (is_valid_placement(board.cbegin(), board.cend()))
answer ++;
} while (next_permutation(board.begin(), board.end()));
cout << answer << endl;
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmJvb2wgaXNfdmFsaWRfcGxhY2VtZW50KGNvbnN0IGF1dG8mIGN1ciwgY29uc3QgYXV0byYgZW5kKSB7CiAgICBzaXplX3QgbiA9IGRpc3RhbmNlKGN1ciwgZW5kKTsKICAgIHZlY3Rvcjx1aW50MzJfdD4gZGlhZ18xKDIgKiBuICsgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgIGRpYWdfMigyICogbiArIDEsIDApOwoKICAgIHNpemVfdCByb3dfaW5kZXggPSAxOwogICAgZm9yX2VhY2goY3VyLCBlbmQsIFsmXSh1aW50NjRfdCByb3cpIHsKICAgICAgICBkaWFnXzFbX19idWlsdGluX2N0emxsKHJvdykgKyAxICsgcm93X2luZGV4XSArKzsKICAgICAgICBkaWFnXzJbX19idWlsdGluX2N0emxsKHJvdykgKyAxIC0gcm93X2luZGV4ICsgbl0gKys7CiAgICAgICAgcm93X2luZGV4ICsrOwogICAgfSk7CgogICAgcmV0dXJuICptYXhfZWxlbWVudChkaWFnXzEuY2JlZ2luKCksIGRpYWdfMS5jZW5kKCkpID09IDEgJiYKICAgICAgICAgICAqbWF4X2VsZW1lbnQoZGlhZ18yLmNiZWdpbigpLCBkaWFnXzIuY2VuZCgpKSA9PSAxOwp9CgppbnQgbWFpbigpIHsKICAgIHNpemVfdCBuOwogICAgY2luID4+IG47CgogICAgdmVjdG9yPHVpbnQ2NF90PiBib2FyZChuKTsKICAgIGlvdGEoYm9hcmQuYmVnaW4oKSwgYm9hcmQuZW5kKCksIDApOwogICAgZm9yX2VhY2goYm9hcmQuYmVnaW4oKSwgYm9hcmQuZW5kKCksIFtdKHVpbnQ2NF90JiByb3cpIHsgcm93ID0gdWludDY0X3QoMSkgPDwgcm93OyB9KTsKCiAgICBzaXplX3QgYW5zd2VyID0gMDsKICAgIGRvIHsKICAgICAgICBpZiAoaXNfdmFsaWRfcGxhY2VtZW50KGJvYXJkLmNiZWdpbigpLCBib2FyZC5jZW5kKCkpKQogICAgICAgICAgICBhbnN3ZXIgKys7CiAgICB9IHdoaWxlIChuZXh0X3Blcm11dGF0aW9uKGJvYXJkLmJlZ2luKCksIGJvYXJkLmVuZCgpKSk7CgogICAgY291dCA8PCBhbnN3ZXIgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9Cg==