#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MAXN = 505; const int MOD = 5201314; char graph[MAXN][MAXN]; int f[2][MAXN][MAXN]; int N, M; // ensure 0 <= a, b < MOD inline int add(int a, int b) { a += b; if (a >= MOD) { a -= MOD; } return a; } int main() { int T; cin >> T; while(T--){ memset(graph,0,sizeof(graph)); memset(f,0,sizeof(f)); scanf("%d", &N); M = N; for (int i = 1; i <= N; ++i) { scanf("%s", graph[i]+1); } if (graph[1][1] != graph[N][M]) { puts("0"); return 0; } f[1][1][N] = 1; int half = (N+M)/2; for (int l = 2; l <= half; ++l) { int tl = N+M-l; int n = l&1; int nn = 1-n; for (int r = 1; r <= N; ++r) { for (int tr = r; tr <= N; ++tr) { f[n][r][tr] = 0; int c = l+1-r; int tc = tl+1-tr; if (c < 1 || c > M || tc < 1 || tc > M || c > tc) { continue; } if (graph[r][c] != graph[tr][tc]) { continue; } int &tmp = f[n][r][tr]; tmp = add(tmp, f[nn][r-1][tr]); tmp = add(tmp, f[nn][r-1][tr+1]); tmp = add(tmp, f[nn][r][tr]); tmp = add(tmp, f[nn][r][tr+1]); } } } int ans = 0; for (int i = 1; i <= N; ++i) { for (int j = 1; j <= N; ++j) { ans = add(ans, f[half&1][i][j]); } } printf("%d\n", ans); } }