#include <bits/stdc++.h>
using namespace std;
const int maxp = 1001;
bool NotPrime[maxp];
int prime[maxp];
int cnt;
void sieve()
{
NotPrime[0] = NotPrime[1] = 1;
for (int i = 2; i < maxp; i++) {
if (!NotPrime[i]) {
for (int j = i * i; j < maxp; j += i) {
NotPrime[j] = 1;
}
}
}
for (int i = 2; i < maxp; i++) {
if (!NotPrime[i]) prime[cnt++] = i;
}
}
const int maxn = 1010, maxprime = 168;
int n;
int a[maxn];
vector<bitset<maxprime> > S;
int res;
int gauss(vector<bitset<maxprime> > a)
{
int ans = 0;
int n = (int)a.size();
int m = maxprime;
for (int col = 0, row = 0; col < m && row < n; col++) {
for (int i = row; i < n; i++) {
if (a[i][col]) {
swap(a[i], a[row]);
break;
}
}
if (!a[row][col])
continue;
ans++;
for (int i = 0; i < n; i++) {
if (i != row && a[i][col]) {
a[i] ^= a[row];
}
}
row++;
}
return ans;
}
void solve()
{
sieve();
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
int x = a[i];
bitset<maxprime> tmp;
tmp.reset();
for (int p = 0; p < maxprime; p++) {
while (x % prime[p] == 0) {
x /= prime[p];
tmp.flip(p);
}
}
S.push_back(tmp);
}
cout << gauss(S);
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApjb25zdCBpbnQgbWF4cCA9IDEwMDE7CmJvb2wgTm90UHJpbWVbbWF4cF07CmludCBwcmltZVttYXhwXTsKaW50IGNudDsKIAp2b2lkIHNpZXZlKCkKewogICAgTm90UHJpbWVbMF0gPSBOb3RQcmltZVsxXSA9IDE7CiAgICBmb3IgKGludCBpID0gMjsgaSA8IG1heHA7IGkrKykgewogICAgICAgIGlmICghTm90UHJpbWVbaV0pIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKiBpOyBqIDwgbWF4cDsgaiArPSBpKSB7CiAgICAgICAgICAgICAgICBOb3RQcmltZVtqXSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAKICAgIGZvciAoaW50IGkgPSAyOyBpIDwgbWF4cDsgaSsrKSB7CiAgICAgICAgaWYgKCFOb3RQcmltZVtpXSkgcHJpbWVbY250KytdID0gaTsKICAgIH0KfQogCmNvbnN0IGludCBtYXhuID0gMTAxMCwgbWF4cHJpbWUgPSAxNjg7CmludCBuOwppbnQgYVttYXhuXTsKdmVjdG9yPGJpdHNldDxtYXhwcmltZT4gPiBTOwppbnQgcmVzOwoKaW50IGdhdXNzKHZlY3RvcjxiaXRzZXQ8bWF4cHJpbWU+ID4gYSkKewogICAgaW50IGFucyA9IDA7CgogICAgaW50IG4gPSAoaW50KWEuc2l6ZSgpOwogICAgaW50IG0gPSBtYXhwcmltZTsKCiAgICBmb3IgKGludCBjb2wgPSAwLCByb3cgPSAwOyBjb2wgPCBtICYmIHJvdyA8IG47IGNvbCsrKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IHJvdzsgaSA8IG47IGkrKykgewogICAgICAgICAgICBpZiAoYVtpXVtjb2xdKSB7CiAgICAgICAgICAgICAgICBzd2FwKGFbaV0sIGFbcm93XSk7IAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghYVtyb3ddW2NvbF0pCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBhbnMrKzsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgIT0gcm93ICYmIGFbaV1bY29sXSkgewogICAgICAgICAgICAgICAgYVtpXSBePSBhW3Jvd107IAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJvdysrOwogICAgfQoKICAgIHJldHVybiBhbnM7Cn0KIAp2b2lkIHNvbHZlKCkKewogICAgc2lldmUoKTsKICAgIGNpbiA+PiBuOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgY2luID4+IGFbaV07CiAgICAgICAgaW50IHggPSBhW2ldOwogICAgICAgIGJpdHNldDxtYXhwcmltZT4gdG1wOwogICAgICAgIHRtcC5yZXNldCgpOwogICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgbWF4cHJpbWU7IHArKykgewogICAgICAgICAgICB3aGlsZSAoeCAlIHByaW1lW3BdID09IDApIHsKICAgICAgICAgICAgICAgIHggLz0gcHJpbWVbcF07CiAgICAgICAgICAgICAgICB0bXAuZmxpcChwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTLnB1c2hfYmFjayh0bXApOwogICAgfQogICAgY291dCA8PCBnYXVzcyhTKTsKfQogCnNpZ25lZCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwogCiAgICBzb2x2ZSgpOwp9