#include using namespace std; #define rep1(a) for (int i = 0; i < (a); i++) #define rep2(i, a) for (int i = 0; i < (a); i++) #define rep3(i, a, b) for (int i = a; i < (b); i++) #define rep4(i, a, b, c) for (int i = a; i < (b); i += c) #define overload4(a, b, c, d, e, ...) e #define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__) using ll = long long; constexpr ll INF = (1LL << 60); void chmax(ll& a, ll b) { a = max(a, b);} void chmin(ll& a, ll b) { a = min(a, b); } inline void YesNo(bool ok) { cout << (ok ? "Yes\n" : "No\n"); } template void input_vec(vector& v) { for (auto& x : v) cin >> x; } template void input(T&... a) { (cin >> ... >> a); } void print() { cout << '\n'; } template void print(const T& a, const Ts&... b) { cout << a; (cout << ... << (cout << ' ', b)); cout << '\n'; } bool is_palindrome(std::string s) { int l = s.size(); for (int i = 0; i < l / 2; i++) { if (s[i] != s[l - i - 1]) return false; } return true; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector C(n); rep(i, n) cin >> C[i]; vector arr; rep(i, n-1) arr.push_back(0); rep(i, n-1) arr.push_back(1); sort(arr.begin(), arr.end()); ll ans = 0; do { int h = 0, w = 0; string s = ""; s += C[0][0]; rep(i, 2*n - 2) { if (arr[i] == 0) h++; else w++; s += C[h][w]; } if (is_palindrome(s))ans++; } while (next_permutation(arr.begin(), arr.end())); cout << ans % 998244353<< endl; return 0; }