#include <bits/stdc++.h>

using namespace std;

//#define _FILES
#define PII pair<int,int>
#define PB push_back
#define SZ size()
#define LEN length()
#define LL long long
const int MAXN = 1200005;
const int MD = 1e9+7;
bool isPrime[MAXN];
int dp[505][200];
vector<LL> pr;
int G(LL x)
{
    int ans,cnt;
    ans = 0;
    for (int i=0;i<pr.size();i++)
    {
        if (pr[i]*pr[i]>x) break;
        cnt = 0;
        while (((x/pr[i])*pr[i])==x)
        {
            cnt++;
            x/=pr[i];
        }
        ans+=cnt;
    }
    if (x>1) ans++;
    return ans;
}
int main()
{
    ios_base::sync_with_stdio(false);

    #ifdef _FILES
        freopen("","r",stdin);
        freopen("","w",stdout);
    #endif // _FILES
    int n,g[505],ans;
    LL x;
    memset(isPrime,true,sizeof(isPrime));
    for (int i=2;i<MAXN;i++)
    {
        if (!isPrime[i]) continue;
        for (int j=2;j*i<MAXN;j++) isPrime[i*j] = false;
        pr.PB(i);
    }
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>x;
        g[i] = G(x);
    }
    memset(dp,0,sizeof(dp));
    dp[0][0] = 1;
    for (int i=1;i<=n;i++)
    {
        for (int j=0;j<200;j++)
        {
            dp[i][j] += dp[i-1][j];
            if (dp[i][j]>=MD) dp[i][j] -= MD;
            dp[i][j^g[i]] += dp[i-1][j];
            if (dp[i][j^g[i]]>=MD) dp[i][j^g[i]] -= MD;
        }
    }
    ans = 0;
    for (int i=1;i<200;i++)
    {
        ans+=dp[n][i];
        if (ans>=MD) ans-=MD;
    }
    cout<<ans<<endl;
    return 0;
}