#include <bits/stdc++.h>
using namespace std;
struct linearbasis {
  long long base[64], flag, cnt;
  bool add(long long x) {
    for (int i = 62; ~i; i--) {
      if (x >> i & 1) {
        if (!base[i]) {
          base[i] = x;
          return false;
        }
        x ^= base[i];
      }
    }
    flag = 1;
    return true;
  }
  long long query_max(long long ans = 0) {
    for (int i = 62; ~i; i--) {
      if ((ans ^ base[i]) > ans) {
        ans ^= base[i];
      }
    }
    return ans;
  }
  long long query_min() {
    for (int i = 0; i <= 62; i++) {
      if (base[i]) {
        return base[i];
      }
    }
  }
  void rebuild() {
    cnt = 0;
    for (int i = 62; i >= 0; i--) {
      for (int j = i - 1; j >= 0; j--) {
        if (base[i] >> j & 1) {
          base[i] ^= base[j];
        }
      }
    }
    for (int i = 0; i <= 62; i++) {
      if (base[i]) {
        long long temp = base[i];
        base[i] = 0;
        base[cnt++] = temp;
      }
    }
  }
  long long query_k(long long k) {
    k -= flag;
    if (k == 0) return 0;
    if (k >= 1ll << cnt) return -1;
    long long ans = 0;
    for (int i = 62; ~i; i--) {
      if (k >> i & 1) {
        ans ^= base[i];
      }
    }
    return ans;
  }
  void init() { memset(base, 0, sizeof base), flag = cnt = 0; }
} a;
int prime[] = {2,  3,  5,  7,  11, 13, 17, 19, 23, 29,
               31, 37, 41, 43, 47, 53, 59, 61, 67};
const int mod = 1e9 + 7;
int main() {
  int n, ans = 0;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int x, value = 0;
    cin >> x;
    for (int j = 0; j < 19; j++) {
      int cnt = 0;
      while (x % prime[j] == 0) {
        cnt++;
        x /= prime[j];
      }
      if (cnt & 1) {
        value |= 1 << j;
      }
    }
    if (a.add(value)) {
      ans++;
    }
  }
  long long res = 1;
  for (int i = 1; i <= ans; i++) {
    res = res * 2 % mod;
  }
  printf("%lld\n", res - 1);
  return 0;
}
