// TEMPLATE - START
// ----------------------------------------------------
using namespace std;
// ----------------------------------------------------
// DEFINES - START
#include <bits/stdc++.h>
#define FAST \
ios_base::sync_with_stdio(0); \
cin.tie(0); \
cout.tie(0);
// Strings
#define nl "\n"
#define bl cout << "\n"
#define YES cout << "YES\n"
#define NO cout << "NO\n"
#define yn(x) \
if (x) \
YES; \
else \
NO;
#define yns(x, s1, s2) \
if (x) \
cout << s1 << "\n"; \
else \
cout << s2 << "\n";
#define fail(cond) \
if (cond) \
return void(NO);
#define success(cond) \
if (cond) \
return void(YES);
#define failS(cond, s) \
if (cond) \
return void(cout << s << nl);
#define successS(cond, s) \
if (cond) \
return void(cout << s << nl);
// Types
#define ll int
#define ld long double
#define ull unsigned long long
#define vl vector<ll>
#define pll pair<ll, ll>
#define vpll vector<pair<ll, ll>>
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
// Loops
#define lp(i, a, b) for (int i = (a); i < (b); i++)
#define rlp(i, a, b) for (int i = (b) - 1; i >= (a); i--)
#define readlp(arr, a, b) \
lp(ind, a, b) cin >> arr[ind];
#define writelp(arr, a, b) \
{ \
lp(ind, a, b) cout << arr[ind] << " "; \
bl; \
}
#define write(v) \
{ \
for (auto x : v) \
cout << x << " "; \
bl; \
}
#define vv \
ll n; \
cin >> n; \
vl v(n); \
readlp(v, 0, v.size());
// DEFINES - END
// ----------------------------------------------------
// DATA_STRUCTURES - START
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
// Ordered set (no duplicates, ordered by Key)
template <class Key>
using ordered_set = tree<Key, null_type, less<Key>, rb_tree_tag, tree_order_statistics_node_update>;
// Ordered multi-set (allows duplicates, ordered by Key)
template <class Key>
using ordered_multi_set = tree<Key, null_type, less_equal<Key>, rb_tree_tag, tree_order_statistics_node_update>;
// Ordered map (Key -> Value, ordered by Key)
template <class Key, class Val>
using ordered_map = tree<Key, Val, less<Key>, rb_tree_tag, tree_order_statistics_node_update>;
// DATA_STRUCTURES - END
// ----------------------------------------------------
// ALGORITHMS - START
// Binary Search Custom:
// To Find...,Logical Condition,If Condition is Met...,Return Value
// Lower Bound (First element ≥x),arr[m] >= x,r = m,r
// Upper Bound (First element >x),arr[m] > x,r = m,r
// Last element <x,arr[m] < x,l = m,l
// Last element ≤x,arr[m] <= x,l = m,l
ll lowerBound(vector<ll> &v, ll x)
{
ll l = -1, r = v.size();
while (r > l + 1)
{
ll m = l + (r - l) / 2;
if (v[m] >= x)
r = m;
else
l = m;
}
return r;
}
// ALGORITHMS - END
// ----------------------------------------------------
// TEMPLATE END
// ====================================================
// Boody's Code
// 2026-10-07, 19:48:34
// Codeforces - Codeforces Round 1125 (Div. 3)
// F. Tea Blend
// https://c...content-available-to-author-only...s.com/contest/2275/problem/F
// Time limit: 00, Memory limit: 5
// status:
// Time taken:
// ----------------------------------------------------
set<ll> primeFactors(ll x)
{
map<ll, ll> factors;
set<ll> rem;
while (x % 2 == 0)
factors[2]++, x = x / 2;
for (ll i = 3; i * i <= x; i = i + 2)
while (x % i == 0)
factors[i]++, x = x / i;
if (x > 2)
factors[x]++;
rem.insert(0);
for (auto [key, val] : factors)
if (val & 1)
rem.insert(key);
return rem;
}
void solve()
{
vv;
map<set<ll>, ll> frq;
lp(i, 0, n) frq[primeFactors(v[i])]++;
set<ll> curr;
curr.insert(0);
ll count = 0;
lp(i, 0, n)
{
for (auto x : primeFactors(v[i]))
{
if (curr.find(x) != curr.end() && (x != 0))
curr.erase(x);
else
curr.insert(x);
}
count += frq[curr];
if (frq[curr] == 0)
frq.erase(curr);
}
cout << count << nl;
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("/home/rodex/rubuntu/CS/CP/input.txt", "r", stdin);
// freopen("/home/rodex/rubuntu/CS/CP/output.txt", "w", stdout);
#endif
FAST;
// precomputePrimeFactors();
int t = 1;
cin >> t;
while (t--)
solve();
}
Ly8gVEVNUExBVEUgLSBTVEFSVAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gREVGSU5FUyAtIFNUQVJUCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgojZGVmaW5lIEZBU1QgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgXAogICAgY2luLnRpZSgwKTsgICAgICAgICAgICAgICAgICAgXAogICAgY291dC50aWUoMCk7Ci8vIFN0cmluZ3MKI2RlZmluZSBubCAiXG4iCiNkZWZpbmUgYmwgY291dCA8PCAiXG4iCiNkZWZpbmUgWUVTIGNvdXQgPDwgIllFU1xuIgojZGVmaW5lIE5PIGNvdXQgPDwgIk5PXG4iCiNkZWZpbmUgeW4oeCkgXAogICAgaWYgKHgpICAgIFwKICAgICAgICBZRVM7ICBcCiAgICBlbHNlICAgICAgXAogICAgICAgIE5POwojZGVmaW5lIHlucyh4LCBzMSwgczIpICAgICAgXAogICAgaWYgKHgpICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNvdXQgPDwgczEgPDwgIlxuIjsgXAogICAgZWxzZSAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNvdXQgPDwgczIgPDwgIlxuIjsKI2RlZmluZSBmYWlsKGNvbmQpIFwKICAgIGlmIChjb25kKSAgICAgIFwKICAgICAgICByZXR1cm4gdm9pZChOTyk7CiNkZWZpbmUgc3VjY2Vzcyhjb25kKSBcCiAgICBpZiAoY29uZCkgICAgICAgICBcCiAgICAgICAgcmV0dXJuIHZvaWQoWUVTKTsKI2RlZmluZSBmYWlsUyhjb25kLCBzKSBcCiAgICBpZiAoY29uZCkgICAgICAgICAgXAogICAgICAgIHJldHVybiB2b2lkKGNvdXQgPDwgcyA8PCBubCk7CiNkZWZpbmUgc3VjY2Vzc1MoY29uZCwgcykgXAogICAgaWYgKGNvbmQpICAgICAgICAgICAgIFwKICAgICAgICByZXR1cm4gdm9pZChjb3V0IDw8IHMgPDwgbmwpOwovLyBUeXBlcwojZGVmaW5lIGxsIGludAojZGVmaW5lIGxkIGxvbmcgZG91YmxlCiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZwojZGVmaW5lIHZsIHZlY3RvcjxsbD4KI2RlZmluZSBwbGwgcGFpcjxsbCwgbGw+CiNkZWZpbmUgdnBsbCB2ZWN0b3I8cGFpcjxsbCwgbGw+PgojZGVmaW5lIGFsbCh4KSAoeCkuYmVnaW4oKSwgKHgpLmVuZCgpCiNkZWZpbmUgcmFsbCh4KSAoeCkucmJlZ2luKCksICh4KS5yZW5kKCkKLy8gTG9vcHMKI2RlZmluZSBscChpLCBhLCBiKSBmb3IgKGludCBpID0gKGEpOyBpIDwgKGIpOyBpKyspCiNkZWZpbmUgcmxwKGksIGEsIGIpIGZvciAoaW50IGkgPSAoYikgLSAxOyBpID49IChhKTsgaS0tKQojZGVmaW5lIHJlYWRscChhcnIsIGEsIGIpIFwKICAgIGxwKGluZCwgYSwgYikgY2luID4+IGFycltpbmRdOwojZGVmaW5lIHdyaXRlbHAoYXJyLCBhLCBiKSAgICAgICAgICAgICAgICAgICAgIFwKICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgbHAoaW5kLCBhLCBiKSBjb3V0IDw8IGFycltpbmRdIDw8ICIgIjsgXAogICAgICAgIGJsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0KI2RlZmluZSB3cml0ZSh2KSAgICAgICAgICAgICAgXAogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yIChhdXRvIHggOiB2KSAgICAgIFwKICAgICAgICAgICAgY291dCA8PCB4IDw8ICIgIjsgXAogICAgICAgIGJsOyAgICAgICAgICAgICAgICAgICBcCiAgICB9CiNkZWZpbmUgdnYgICAgXAogICAgbGwgbjsgICAgIFwKICAgIGNpbiA+PiBuOyBcCiAgICB2bCB2KG4pOyAgXAogICAgcmVhZGxwKHYsIDAsIHYuc2l6ZSgpKTsKLy8gREVGSU5FUyAtIEVORAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIERBVEFfU1RSVUNUVVJFUyAtIFNUQVJUCiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+Cgp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKCi8vIE9yZGVyZWQgc2V0IChubyBkdXBsaWNhdGVzLCBvcmRlcmVkIGJ5IEtleSkKdGVtcGxhdGUgPGNsYXNzIEtleT4KdXNpbmcgb3JkZXJlZF9zZXQgPSB0cmVlPEtleSwgbnVsbF90eXBlLCBsZXNzPEtleT4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+OwoKLy8gT3JkZXJlZCBtdWx0aS1zZXQgKGFsbG93cyBkdXBsaWNhdGVzLCBvcmRlcmVkIGJ5IEtleSkKdGVtcGxhdGUgPGNsYXNzIEtleT4KdXNpbmcgb3JkZXJlZF9tdWx0aV9zZXQgPSB0cmVlPEtleSwgbnVsbF90eXBlLCBsZXNzX2VxdWFsPEtleT4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+OwoKLy8gT3JkZXJlZCBtYXAgKEtleSAtPiBWYWx1ZSwgb3JkZXJlZCBieSBLZXkpCnRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFZhbD4KdXNpbmcgb3JkZXJlZF9tYXAgPSB0cmVlPEtleSwgVmFsLCBsZXNzPEtleT4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+OwovLyBEQVRBX1NUUlVDVFVSRVMgLSBFTkQKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBTEdPUklUSE1TIC0gU1RBUlQKLy8gQmluYXJ5IFNlYXJjaCBDdXN0b206Ci8vIFRvIEZpbmQuLi4sTG9naWNhbCBDb25kaXRpb24sSWYgQ29uZGl0aW9uIGlzIE1ldC4uLixSZXR1cm4gVmFsdWUKLy8gTG93ZXIgQm91bmQgKEZpcnN0IGVsZW1lbnQg4omleCksYXJyW21dID49IHgsciA9IG0scgovLyBVcHBlciBCb3VuZCAoRmlyc3QgZWxlbWVudCA+eCksYXJyW21dID4geCxyID0gbSxyCi8vIExhc3QgZWxlbWVudCA8eCxhcnJbbV0gPCB4LGwgPSBtLGwKLy8gTGFzdCBlbGVtZW50IOKJpHgsYXJyW21dIDw9IHgsbCA9IG0sbAoKbGwgbG93ZXJCb3VuZCh2ZWN0b3I8bGw+ICZ2LCBsbCB4KQp7CiAgICBsbCBsID0gLTEsIHIgPSB2LnNpemUoKTsKICAgIHdoaWxlIChyID4gbCArIDEpCiAgICB7CiAgICAgICAgbGwgbSA9IGwgKyAociAtIGwpIC8gMjsKICAgICAgICBpZiAodlttXSA+PSB4KQogICAgICAgICAgICByID0gbTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGwgPSBtOwogICAgfQogICAgcmV0dXJuIHI7Cn0KLy8gQUxHT1JJVEhNUyAtIEVORAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFRFTVBMQVRFIEVORAoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy8gQm9vZHkncyBDb2RlCi8vIDIwMjYtMTAtMDcsIDE5OjQ4OjM0Ci8vIENvZGVmb3JjZXMgLSBDb2RlZm9yY2VzIFJvdW5kIDExMjUgKERpdi4gMykKLy8gRi4gVGVhIEJsZW5kCi8vIGh0dHBzOi8vYy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20vY29udGVzdC8yMjc1L3Byb2JsZW0vRgovLyBUaW1lIGxpbWl0OiAwMCwgTWVtb3J5IGxpbWl0OiA1Ci8vIHN0YXR1czoKLy8gVGltZSB0YWtlbjoKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnNldDxsbD4gcHJpbWVGYWN0b3JzKGxsIHgpCnsKICAgIG1hcDxsbCwgbGw+IGZhY3RvcnM7CiAgICBzZXQ8bGw+IHJlbTsKICAgIHdoaWxlICh4ICUgMiA9PSAwKQogICAgICAgIGZhY3RvcnNbMl0rKywgeCA9IHggLyAyOwogICAgZm9yIChsbCBpID0gMzsgaSAqIGkgPD0geDsgaSA9IGkgKyAyKQogICAgICAgIHdoaWxlICh4ICUgaSA9PSAwKQogICAgICAgICAgICBmYWN0b3JzW2ldKyssIHggPSB4IC8gaTsKICAgIGlmICh4ID4gMikKICAgICAgICBmYWN0b3JzW3hdKys7CgogICAgcmVtLmluc2VydCgwKTsKICAgIGZvciAoYXV0byBba2V5LCB2YWxdIDogZmFjdG9ycykKICAgICAgICBpZiAodmFsICYgMSkKICAgICAgICAgICAgcmVtLmluc2VydChrZXkpOwoKICAgIHJldHVybiByZW07Cn0KCnZvaWQgc29sdmUoKQp7CiAgICB2djsKICAgIG1hcDxzZXQ8bGw+LCBsbD4gZnJxOwogICAgbHAoaSwgMCwgbikgZnJxW3ByaW1lRmFjdG9ycyh2W2ldKV0rKzsKCiAgICBzZXQ8bGw+IGN1cnI7CiAgICBjdXJyLmluc2VydCgwKTsKICAgIGxsIGNvdW50ID0gMDsKICAgIGxwKGksIDAsIG4pCiAgICB7CiAgICAgICAgZm9yIChhdXRvIHggOiBwcmltZUZhY3RvcnModltpXSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoY3Vyci5maW5kKHgpICE9IGN1cnIuZW5kKCkgJiYgKHggIT0gMCkpCiAgICAgICAgICAgICAgICBjdXJyLmVyYXNlKHgpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjdXJyLmluc2VydCh4KTsKICAgICAgICB9CiAgICAgICAgY291bnQgKz0gZnJxW2N1cnJdOwogICAgICAgIGlmIChmcnFbY3Vycl0gPT0gMCkKICAgICAgICAgICAgZnJxLmVyYXNlKGN1cnIpOwogICAgfQogICAgY291dCA8PCBjb3VudCA8PCBubDsKfQoKaW50IG1haW4oKQp7CiNpZm5kZWYgT05MSU5FX0pVREdFCiAgICAvLyBmcmVvcGVuKCIvaG9tZS9yb2RleC9ydWJ1bnR1L0NTL0NQL2lucHV0LnR4dCIsICJyIiwgc3RkaW4pOwogICAgLy8gZnJlb3BlbigiL2hvbWUvcm9kZXgvcnVidW50dS9DUy9DUC9vdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwojZW5kaWYKICAgIEZBU1Q7CiAgICAvLyBwcmVjb21wdXRlUHJpbWVGYWN0b3JzKCk7CiAgICBpbnQgdCA9IDE7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pCiAgICAgICAgc29sdmUoKTsKfQ==