#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace std;
using namespace __gnu_pbds;
#define ll long long int
#define ld long double
#define bitcount __builtin_popcountll
#define mod 1000000007
#define pii pair<int,int> 
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define s(n) scanf("%d",&n)
#define sll(n) scanf("%lld",&n)
#define all(v) v.begin(),v.end()
#define p(x) printf("%d ",x)
#define pll(x) printf("%lld",x)
#define pend printf("\n")
#define debug(x) cout << "> " << #x << " : " << x << "\n";
#define gur_chella ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define N 200005
#define LN 20
#define infinity 4123456789123456789ll
#define CMOD 998244353 
#define pall pair<ll,ll> 
typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
ll powfi(ll x, ll y, ll p)
{
    ll ans = 1;
    x%=p;
    while (y > 0)
    {
        if (y & 1)
            ans = ((ans%p)*(x%p))%p;
        y = y>>1;
        x = (x*x)%p;
    }
    return ans%p;
}
// void init()
// {
// 	for(int i=0;i<2002;i++)
// 	{
// 		for(int j=0;j<2002;j++)
// 		{
// 			if(j==0 || j==i)
// 				ncr[i][j]=1;
// 			else if(j>i)
// 				ncr[i][j]=0;
// 			else
// 				ncr[i][j]=((ncr[i-1][j-1]%CMOD) + (ncr[i-1][j] % CMOD) )%CMOD;
// 		}
// 	}
// }
// inline int scan()
// {
//     char c = getchar_unlocked();
//     int x = 0;
//     while(c<'0'||c>'9'){
//         c=getchar_unlocked();
//     }
//     while(c>='0'&&c<='9'){
//         x=(x<<1)+(x<<3)+c-'0';
//         c=getchar_unlocked();
//     }
//     return x;
// }
//------------------End of Template-------------//
bool arr[5205][5205];
int n;
// string binary(char a)
// {
// 	string ans;
// 	switch(a)
// 	{
// 		case '0' : ans="0000";
// 			break;
// 		case '1' : ans="0001";
// 			break;
// 		case '2' : ans="0010";
// 			break;
// 		case '3' : ans="0011";
// 			break;
// 		case '4' : ans="0100";
// 			break;
// 		case '5' : ans="0101";
// 			break;
// 		case '6' : ans="0110";
// 			break;
// 		case '7' : ans="0111";
// 			break;
// 		case '8' : ans="1000";
// 			break;
// 		case '9' : ans="1001";
// 			break;
// 		case 'A' : ans="1010";
// 			break;
// 		case 'B' : ans="1011";
// 			break;
// 		case 'C' : ans="1100";
// 			break;
// 		case 'D' : ans="1101";
// 			break;
// 		case 'E' : ans="1110";
// 			break;
// 		case 'F' : ans="1111";
// 			break;
// 	}
// 	return ans;
// }
vector<int>factors;
void div(int n)
{
	for (int i=1; i<=sqrt(n); i++) 
    { 
        if (n%i == 0) 
        { 
            // If divisors are equal, print only one 
            if (n/i == i) 
                factors.pb(i);
  
            else // Otherwise print both 
                factors.pb(i),factors.pb(n/i); 
        } 
    }
}
bool gg(int a, int b, int c, int d)
{
	bool curr=arr[a][b];
	for(int i=a;i<=c;++i)
	{
		for(int j=b;j<=d;++j)
		{
			if(arr[i][j]!=curr)
				return false;
		}
	}
	return true;
}
bool g(int x)
{
	int i, j;
	bool flag=true,flag1;
	for(i=1;i<=n;i+=x)
	{
		for(j=1;j<=n;j+=x)
		{
			flag1=gg(i,j,i+x-1,j+x-1);
			if(flag1==false)
				return false;
		}
	}
	return true;
}
signed main()
{
    gur_chella;
    int i, j, k,cnt;
    int T;
    //cin>>T;
    T=1;
    while(T--)
    {
    	cin>>n;
    	string a,ab;
    	for(i=1;i<=n;++i)
    	{
    		cin>>a;
    		for(int kk=0;kk<a.length();++kk)
    		{
    			switch(a[kk])
				{
					case '0' : ab="0000";
						break;
					case '1' : ab="0001";
						break;
					case '2' : ab="0010";
						break;
					case '3' : ab="0011";
						break;
					case '4' : ab="0100";
						break;
					case '5' : ab="0101";
						break;
					case '6' : ab="0110";
						break;
					case '7' : ab="0111";
						break;
					case '8' : ab="1000";
						break;
					case '9' : ab="1001";
						break;
					case 'A' : ab="1010";
						break;
					case 'B' : ab="1011";
						break;
					case 'C' : ab="1100";
						break;
					case 'D' : ab="1101";
						break;
					case 'E' : ab="1110";
						break;
					case 'F' : ab="1111";
						break;
				}
    			//cout<<ab<<"\n";
    			for(cnt=0;cnt<4;++cnt)
    				arr[i][kk*4 + cnt + 1]=(ab[cnt]=='1');
    		}
    	}
    	// for(i=1;i<=n;++i)
    	// {
    	// 	for(j=1;j<=n;++j)
    	// 		cout<<arr[i][j];
    	// 	cout<<"\n";
    	// }
    	div(n);
    	sort(all(factors));
    	int low=0,high=factors.size()-1,mid;
    	while(high-low>1)
    	{
    		mid=(low+high)>>1;
    		if(g(factors[mid]))
    			low=mid;
    		else
    			high=mid-1;
    	}
    	int ans=-1;
    	if(g(factors[high]))
    		ans=factors[high];
    	else
    		ans=factors[low];
    	cout<<ans<<"\n";
    	//cout<<g(2)<<"\n";
    	
    }
    return 0;
}