// g++-15 1.cpp -std=c++23 -O2 -I . #include using namespace std; #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") // #include // #include // #include // using namespace __gnu_pbds; #include using namespace atcoder; using ll = long long; using ld = long double; using vi = vector; using vvi = vector; using vll = vector; using vvll = vector; using vld = vector; using vvld = vector; using vst = vector; using vvst = vector; #define fi first #define se second #define pb push_back #define eb emplace_back #define pq_big(T) priority_queue,less> #define pq_small(T) priority_queue,greater> #define all(a) a.begin(),a.end() #define rep(i,start,end) for(ll i=start;i<(ll)(end);i++) #define per(i,start,end) for(ll i=start;i>=(ll)(end);i--) #define uniq(a) sort(all(a));a.erase(unique(all(a)),a.end()) random_device seed; mt19937_64 randint(seed()); ll grr(ll mi, ll ma) { // [mi, ma) return mi + randint() % (ma - mi); } using mint = modint998244353; void solve(){ int n;cin>>n; vst g(n); rep(i,0,n)cin>>g[i]; if(g[0][0]!=g[n-1][n-1]){ cout<<0<,mint> mp; mp[{0,(n-1)*n+(n-1)}]=1; rep(i,1,n-1){ rep(j,0,i+1){ // (j, i - j) int cj=j*n+i-j; rep(k,0,i+1){ // (n - 1 - k, n - 1 - i + k) int ck=(n-1-k)*n+(n-1-i+k); if(g[j][i-j]!=g[n-1-k][n-1-i+k])continue; rep(l,0,2){ rep(m,0,2){ int x=j,y=i-j,z=n-1-k,w=n-1-i+k; if(l)x--; else y--; if(m)z++; else w++; if(min(x,y)<0)continue; if(max(z,w)>=n)continue; if(g[x][y]!=g[z][w])continue; mp[{cj,ck}]+=mp[{x*n+y,z*n+w}]; } } } } } mint ans=0; rep(i,0,n){ rep(l,0,2){ rep(m,0,2){ int x=i,y=n-1-i,z=i,w=n-1-i; if(l)x--; else y--; if(m)z++; else w++; if(min(x,y)<0)continue; if(max(z,w)>=n)continue; if(g[x][y]!=g[z][w])continue; ans+=mp[{x*n+y,z*n+w}]; } } } cout<>t; while(t--){ solve(); } }