// Java solution for problem C // Author: Adam Polak import java.io.*; public class c { public static void main(String[] args) throws IOException { (new c()).solve(); } int n, T; long[] tree; void solve() throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int Z = Integer.parseInt(in.readLine()); while (Z-- > 0) { n = Integer.parseInt(in.readLine()); T = 1; while (T < n) T *= 2; tree = new long[2 * T]; String[] tokens = in.readLine().split(" "); for (int i = 0; i < n; ++i) tree[T + i] = Long.parseLong(tokens[i]); for (int i = n; i < T; ++i) tree[T + i] = 1; for (int i = T - 1; i >= 0; --i) tree[i] = gcd(tree[2*i], tree[2*i+1]); long best = n; int size = T, nextLevelStartsAt = 2; for (int i = 1; i < 2 * T; ++i) { if (i == nextLevelStartsAt) { size /= 2; nextLevelStartsAt *= 2; } for (int k = 1; k <= 3; ++k) if (tree[i] % k == 0 && tree[i] / k > 1) best = Math.max(best, tree[i] / k * (long)longest(i, size, tree[i] / k)); } System.out.println(best); } } private int longest(int a, int size, long div) { int res = size; boolean canGoLeft = true, canGoRight = true; while (a > 1 && (canGoLeft || canGoRight)) { if (a % 2 == 0 && canGoRight) { if (tree[a + 1] % div == 0) { res += size; } else { res += longestPrefix(a + 1, size, div); canGoRight = false; } } else if (a % 2 == 1 && canGoLeft) { if (tree[a - 1] % div == 0) { res += size; } else { res += longestSuffix(a - 1, size, div); canGoLeft = false; } } a /= 2; size *= 2; } return res; } private int longestPrefix(int a, int size, long div) { int res = 0; while (a < T) { size /= 2; if (tree[2 * a] % div == 0) { res += size; a = 2 * a + 1; } else { a = 2 * a; } } return res; } private int longestSuffix(int a, int size, long div) { int res = 0; while (a < T) { size /= 2; if (tree[2 * a + 1] % div == 0) { res += size; a = 2 * a; } else { a = 2 * a + 1; } } return res; } private static long gcd(long a, long b) { long temp; while (b != 0) { temp = a % b; a = b; b = temp; } return a; } }