#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
const int MAX_A = 1000000;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
// 筛法求最小质因子
vector<int> minPrime(MAX_A + 1, 0);
for (int i = 2; i <= MAX_A; i++) {
if (minPrime[i] == 0) {
minPrime[i] = i;
for (long long j = (long long)i * i; j <= MAX_A; j += i) {
if (minPrime[j] == 0) {
minPrime[j] = i;
}
}
}
}
int n;
cin >> n;
unordered_map<int, int> firstOccur;
firstOccur[0] = 0; // 初始状态(空乘积)在位置0
int state = 0;
int maxLen = -1;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
// 分解质因数,更新状态
while (x > 1) {
int p = minPrime[x];
int cnt = 0;
while (x % p == 0) {
x /= p;
cnt++;
}
if (cnt % 2 == 1) {
// 奇数次出现,翻转该质因子的奇偶性
state ^= p;
}
}
// 检查之前是否出现过相同状态
if (firstOccur.count(state)) {
int len = i - firstOccur[state];
if (len > maxLen) {
maxLen = len;
}
} else {
firstOccur[state] = i;
}
}
if (maxLen <= 0) {
cout << -1 << '\n';
} else {
cout << maxLen << '\n';
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNQVhfQSA9IDEwMDAwMDA7CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICAvLyDnrZvms5XmsYLmnIDlsI/otKjlm6DlrZAKICAgIHZlY3RvcjxpbnQ+IG1pblByaW1lKE1BWF9BICsgMSwgMCk7CiAgICBmb3IgKGludCBpID0gMjsgaSA8PSBNQVhfQTsgaSsrKSB7CiAgICAgICAgaWYgKG1pblByaW1lW2ldID09IDApIHsKICAgICAgICAgICAgbWluUHJpbWVbaV0gPSBpOwogICAgICAgICAgICBmb3IgKGxvbmcgbG9uZyBqID0gKGxvbmcgbG9uZylpICogaTsgaiA8PSBNQVhfQTsgaiArPSBpKSB7CiAgICAgICAgICAgICAgICBpZiAobWluUHJpbWVbal0gPT0gMCkgewogICAgICAgICAgICAgICAgICAgIG1pblByaW1lW2pdID0gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpbnQgbjsKICAgIGNpbiA+PiBuOwoKICAgIHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IGZpcnN0T2NjdXI7CiAgICBmaXJzdE9jY3VyWzBdID0gMDsgLy8g5Yid5aeL54q25oCB77yI56m65LmY56ev77yJ5Zyo5L2N572uMAoKICAgIGludCBzdGF0ZSA9IDA7CiAgICBpbnQgbWF4TGVuID0gLTE7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgaW50IHg7CiAgICAgICAgY2luID4+IHg7CgogICAgICAgIC8vIOWIhuino+i0qOWboOaVsO+8jOabtOaWsOeKtuaAgQogICAgICAgIHdoaWxlICh4ID4gMSkgewogICAgICAgICAgICBpbnQgcCA9IG1pblByaW1lW3hdOwogICAgICAgICAgICBpbnQgY250ID0gMDsKICAgICAgICAgICAgd2hpbGUgKHggJSBwID09IDApIHsKICAgICAgICAgICAgICAgIHggLz0gcDsKICAgICAgICAgICAgICAgIGNudCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjbnQgJSAyID09IDEpIHsKICAgICAgICAgICAgICAgIC8vIOWlh+aVsOasoeWHuueOsO+8jOe/u+i9rOivpei0qOWboOWtkOeahOWlh+WBtuaApwogICAgICAgICAgICAgICAgc3RhdGUgXj0gcDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8g5qOA5p+l5LmL5YmN5piv5ZCm5Ye6546w6L+H55u45ZCM54q25oCBCiAgICAgICAgaWYgKGZpcnN0T2NjdXIuY291bnQoc3RhdGUpKSB7CiAgICAgICAgICAgIGludCBsZW4gPSBpIC0gZmlyc3RPY2N1cltzdGF0ZV07CiAgICAgICAgICAgIGlmIChsZW4gPiBtYXhMZW4pIHsKICAgICAgICAgICAgICAgIG1heExlbiA9IGxlbjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZpcnN0T2NjdXJbc3RhdGVdID0gaTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKG1heExlbiA8PSAwKSB7CiAgICAgICAgY291dCA8PCAtMSA8PCAnXG4nOwogICAgfSBlbHNlIHsKICAgICAgICBjb3V0IDw8IG1heExlbiA8PCAnXG4nOwogICAgfQoKICAgIHJldHVybiAwOwp9