#include #include using namespace std; using namespace atcoder; typedef long long int ll; typedef long double ld; typedef vector vi; typedef vector vl; typedef vector vvl; typedef vector vvvl; typedef vector vvvvl; typedef vector vb; typedef vector vvb; typedef vector vvvb; typedef vector vvvvb; typedef pair pl; typedef pair ppl; typedef pair pppl; typedef pair pppppl; #define rep(i,a,b) for(int i=(a);i<(b);i++) #define rrep(i,a,b) for(int i=(b)-1;i>=(a);i--) #define all(a) begin(a),end(a) #define sz(a) (int)(a).size() #define F first #define S second #define bs(A,x) binary_search(all(A),x) #define lb(A,x) (ll)(lower_bound(all(A),x)-A.begin()) #define ub(A,x) (ll)(upper_bound(all(A),x)-A.begin()) #define cou(A,x) (ll)(upper_bound(all(A),x)-lower_bound(all(A),x)) templateusing min_priority_queue=priority_queue,greater>; templatebool chmax(T&a,T b){if(abool chmin(T&a,T b){if(b vm; typedef vector vvm; typedef vector vvvm; typedef vector vvvvm; ostream&operator<<(ostream&os,mint a){os<>(istream&is,mint&a){int x;is>>x;a=mint(x);return is;} //*/ templateostream&operator<<(ostream&os,pairp){os<istream&operator>>(istream&is,pair&p){is>>p.F>>p.S;return is;} templateostream&operator<<(ostream&os,vectorv){rep(i,0,sz(v))os<istream&operator>>(istream&is,vector&v){for(T&in:v)is>>in;return is;} int main(){ cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); ll N;cin>>N; //N=500; vectorS(N); cin>>S; //rep(i,0,N)S[i]=string(N,'#'); if(N<=8){ using ull=unsigned long long; ull x; rep(i,0,N)rep(j,0,N)if(S[i][j]=='#')x|=1ull<<(i*N+j); vectorB; vectorQ; rep(k,3,N+1)if(k%2)rep(i,0,N+1-k)rep(j,0,N+1-k){ ull b=0; rep(x,0,k)b|=1ull<<((i+x)*N+(j+x)); rep(x,0,k)b|=1ull<<((i+k-1-x)*N+(j+x)); B.emplace_back(b); Q.emplace_back(k,pl(i,j)); } vectorbasis; vectorRE; rep(i,0,sz(B)){ ull re=1ull<ans; rep(i,0,sz(Q))if((re>>i)&1)ans.emplace_back(Q[i]); cout<Q; rep(k,3,N+1)if(k%2){ rep(i,0,N+1-k)rep(j,0,N+1-k){ if(i<=1||j<=1||i+k-1>=N-2||j+k-1>=N-2){ ll b=0; rep(x,0,k)b^=J[i+x][j+x]; rep(x,0,k)if(x!=k/2)b^=J[i+k-1-x][j+x]; if(b){ B.emplace_back(b); Q.emplace_back(k,pl(i,j)); } } } } ll x=0; rep(i,0,N)rep(j,0,N)if(S[i][j]=='#')x^=J[i][j]; vl basis; vvl E; rep(i,0,sz(B)){ ll b=B[i]; vl e={i}; rep(j,0,sz(basis))if(chmin(b,b^basis[j])){ for(auto k:E[j])e.emplace_back(k); } if(b){ sort(all(e)); vl _e; rep(i,0,sz(e)){ if(i+1ans; auto op=[&](ll k,ll x,ll y){ rep(z,0,k)S[x+z][y+z]='#'+'.'-S[x+z][y+z]; rep(z,0,k)if(z!=k/2)S[x+k-1-z][y+z]='#'+'.'-S[x+k-1-z][y+z]; ans.emplace_back(k,pl(x,y)); }; rep(i,0,sz(Q))if(OP[i]){ auto[k,p]=Q[i]; auto[x,y]=p; op(k,x,y); } rrep(i,4,N-4){ if(S[i][0]=='#')op(3,i-2,0); if(S[i][1]=='#')op(3,i-2,1); if(S[0][i]=='#')op(3,0,i-2); if(S[1][i]=='#')op(3,1,i-2); if(S[i][N-1]=='#')op(3,i-2,N-3); if(S[i][N-2]=='#')op(3,i-2,N-4); if(S[N-1][i]=='#')op(3,N-3,i-2); if(S[N-2][i]=='#')op(3,N-4,i-2); } rep(i,2,N-2)rep(j,2,N-2)if(S[i][j]=='#'){ op(3,i-2,j-2); op(3,i,j-2); op(3,i-2,j); op(3,i,j); op(5,i-2,j-2); } sort(all(ans)); vector_ans; rep(i,0,sz(ans)){if(i+1