#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;
}
