#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define Acode ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define int long long
const int N = 1e6 + 10;
int a[N];
map<int, int> mp1;
map<int, int> mp;
int s[N];
int vis[N], idx, p[N];
int qpow(long long a, long long b)
{
int ans = 1;
int k = a;
while (b)
{
if (b & 1)
ans = ans * k;
k = k * k;
b >>= 1;
}
return ans;
}
void get_primes(int n)
{
vis[1] = 1;
for (int i = 2; i <= N; ++i)
{
if (!vis[i])
{
p[++idx] = i;
mp1[i] = idx;
}
for (int j = 1; j <= idx && p[j] * i <= n; ++j)
{
vis[p[j] * i] = 1;
if (i % p[j] == 0)
break;
}
}
}
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
int ans = 0;
int sum = 0;
for (int i = 1; i <= n; i++)
{
int x = a[i];
if (x == 0)
{
ans += n - (sum + 1);
sum++;
continue;
}
vector<int> f;
for (int j = 2; j * j <= x; j++)
{
int cnt = 0;
if (x % j)
continue;
while (x % j == 0)
{
x /= j;
cnt++;
}
if (cnt & 1)
f.push_back(j);
}
if (x != 1)
f.push_back(x);
int res = 0;
for (auto it : f)
{
int w = mp1[it];
int x = qpow(2LL, w);
res += x;
}
ans += mp[res];
mp[res]++;
}
cout << ans << endl;
}
signed main()
{
Acode;
get_primes(2e5 + 10);
int T = 1;
while (T--)
{
solve();
}
return 0;
}