import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.io.IOException;
import java.util.ArrayList;
import java.io.InputStream;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 *
 * @author real
 */
public class Main {
    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        PrintWriter out = new PrintWriter(outputStream);
        TaskD solver = new TaskD();
        solver.solve(1, in, out);
        out.close();
    }

    static class TaskD {
        ArrayList<Integer> factors;
        HashMap<Character, Integer> hexa;
        int[][] bit;
        int[][] pre;
        int n;

        public void solve(int testNumber, InputReader in, PrintWriter out) {
            n = in.nextInt();
            bit = new int[n][n];
            factors = new ArrayList<>();
            for (int i = 1; i <= n; i++) {
                if (n % i == 0) {
                    factors.add(i);
                }
            }
            hexa = new HashMap<>();
            for (int i = 0; i <= 9; i++) {
                hexa.put((char) (i + '0'), i);
            }
            for (int j = 0; j < 6; j++) {
                hexa.put((char) ('A' + j), 10 + j);
            }


            for (int i = 0; i < n; i++) {
                String str = in.readString();
                for (int j = 0; j < str.length(); j++) {
                    char ch = str.charAt(j);
                    int val = hexa.get(ch);
                    //   System.out.println(val+" "+ch);
                    for (int k = 0; k < 4; k++) {
                        if (((1 << (3 - k)) & (val)) != 0) {
                            bit[i][j * 4 + k] = 1;
                        } else {
                            bit[i][j * 4 + k] = 0;
                        }
                    }
                }
            }
            pre = new int[n + 1][n + 1];
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    pre[i + 1][j + 1] = pre[i][j + 1] + pre[i + 1][j] - pre[i][j] + bit[i][j];

                }
            }

            int ans = 0;
            for (int x : factors) {
                if (check(x)) {
                    ans = Math.max(ans, x);
                }
            }
            out.println(ans);
        }

        boolean check(int x) {
            for (int i = 0; i < n / x; i++) {
                for (int j = 0; j < n / x; j++) {
                    // System.out.println(i*x+" "+j*x+" "+((i+1)*(x)-1)+" "+((j+1)*(x)-1));
                    int ans = getsum(i * x, j * x, (i + 1) * x - 1, (j + 1) * x - 1);
                    //   System.out.println(ans+" "+x);
                    if (ans == x * x || ans == 0) {

                    } else {
                        return false;
                    }
                }
            }
            return true;
        }

        int getsum(int x1, int y1, int x2, int y2) {
            int ans = pre[x2 + 1][y2 + 1];
            ans = ans + pre[x1][y1];
            ans = ans - pre[x1][y2 + 1];
            ans = ans - pre[x2 + 1][y1];
            return ans;
        }

    }

    static class InputReader {
        private final InputStream stream;
        private final byte[] buf = new byte[8192];
        private int curChar;
        private int snumChars;

        public InputReader(InputStream st) {
            this.stream = st;
        }

        public int read() {
            //*-*------clare------
//remeber while comparing 2 non primitive data type not to use ==
//remember Arrays.sort for primitive data has worst time case complexity of 0(n^2) bcoz it uses quick sort
//again silly mistakes ,yr kb tk krta rhega ye mistakes
//try to write simple codes ,break it into simple things
            // for test cases make sure println(); ;)
//knowledge>rating
        /*
        public class Main
        implements Runnable{
    public static void main(String[] args) {
        new Thread(null,new Main(),"Main",1<<26).start();

    }
    public void run() {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        PrintWriter out = new PrintWriter(outputStream);
        TaskC solver = new TaskC();//chenge the name of task
        solver.solve(1, in, out);
        out.close();
    }
         */

            if (snumChars == -1)
                throw new InputMismatchException();
            if (curChar >= snumChars) {
                curChar = 0;
                try {
                    snumChars = stream.read(buf);
                } catch (IOException e) {
                    throw new InputMismatchException();
                }
                if (snumChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }

        public int nextInt() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }
            int res = 0;
            do {
                res *= 10;
                res += c - '0';
                c = read();
            } while (!isSpaceChar(c));
            return res * sgn;
        }

        public String readString() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            StringBuilder res = new StringBuilder();
            do {
                res.appendCodePoint(c);
                c = read();
            } while (!isSpaceChar(c));
            return res.toString();
        }

        public boolean isSpaceChar(int c) {
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }

    }
}

