#include #include #include #include #include #include #include #include #include #include #include #include #define INF (1ll<<62) #define mem(x,y) memset(x,y,sizeof(x)) #define pb push_back using namespace std; typedef long long ll; #define bug puts("==========="); const double pi=(acos(-1.0)); const double eps=1e-8; const int inf=1e9+10; const int maxn=500+5; const int mod=5201314; /*===============================*/ char maze[505][505]; int dp[2][505][505]; void add(int &a,int b) { a+=b; while(a>=mod) a-=mod; } int main() { int T; scanf("%d",&T); while(T--) { int n,m,i,j,cur; scanf("%d",&n); m=n; memset(dp,0,sizeof(dp)); for(i=1; i<=n; i++) scanf("%s",maze[i]+1); cur=0; dp[cur][1][n]=(maze[1][1]==maze[n][m]); for(int step=1; step<=(n+m-2)/2; step++) { cur^=1; for(int x1=1; x1<=n; x1++) for(int x2=1; x2<=n; x2++) dp[cur][x1][x2]=0; for(int x1=1; x1<=n && x1-1<=step; x1++) { for(int x2=n; x2>=1 && n-x2<=step; x2--) { int y1=step-(x1-1)+1; int y2=m-(step-(n-x2)); if(maze[x1][y1]!=maze[x2][y2]) continue ; add(dp[cur][x1][x2],dp[cur^1][x1-1][x2+1]); add(dp[cur][x1][x2],dp[cur^1][x1-1][x2]); add(dp[cur][x1][x2],dp[cur^1][x1][x2+1]); add(dp[cur][x1][x2],dp[cur^1][x1][x2]); } } } int ans=0; for(i=1; i<=n; i++) { add(ans,dp[cur][i][i]); if((n+m)&1) add(ans,dp[cur][i][i+1]); } printf("%d\n",ans); } return 0; }