#include <iostream>
#include <numeric>
#include <algorithm>
#include <vector>
#include <array>
using namespace std;
constexpr int limit = 10000;
constexpr int diff = 32;
constexpr int bucket_num = (limit/diff)+1;
int adjacent_buckets(const vector<int>& bucket1, const vector<int>& bucket2)
{
std::array<int,diff> pairs{};
for(int number : bucket1)
{
for(int i=0;i<number;i++)
pairs[i]++;
}
return std::accumulate(bucket2.begin(), bucket2.end(), 0,
[&pairs](int s, int n){ return s + pairs[n]; });
}
void solve()
{
int i,n;
std::array<std::vector<int>,bucket_num> buckets;
cin>>n;
int number;
for(i=0;i<n;i++)
{
cin >> number;
buckets[number/diff].push_back(number%diff);
}
int result = std::accumulate(buckets.begin(), buckets.end(), 0,
[](int s, vector<int>& v){ return s + (v.size()*(v.size()-1))/2; });
for(int i=0;i<bucket_num-1;i++)
if(buckets[i].size() && buckets[i+1].size())
result += adjacent_buckets(buckets[i], buckets[i+1]);
cout << result << endl;
}
int main() {
int T;
cin >> T;
for (int i=0 ; i<T ; i++)
solve();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFycmF5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0ZXhwciBpbnQgbGltaXQgPSAxMDAwMDsKY29uc3RleHByIGludCBkaWZmID0gMzI7CmNvbnN0ZXhwciBpbnQgYnVja2V0X251bSA9IChsaW1pdC9kaWZmKSsxOwoKaW50IGFkamFjZW50X2J1Y2tldHMoY29uc3QgdmVjdG9yPGludD4mIGJ1Y2tldDEsIGNvbnN0IHZlY3RvcjxpbnQ+JiBidWNrZXQyKQp7CiAgICBzdGQ6OmFycmF5PGludCxkaWZmPiBwYWlyc3t9OwogICAgZm9yKGludCBudW1iZXIgOiBidWNrZXQxKQogICAgIHsKICAgICAgICAgZm9yKGludCBpPTA7aTxudW1iZXI7aSsrKQogICAgICAgICAgICBwYWlyc1tpXSsrOwogICAgIH0KCiAgICByZXR1cm4gc3RkOjphY2N1bXVsYXRlKGJ1Y2tldDIuYmVnaW4oKSwgYnVja2V0Mi5lbmQoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZwYWlyc10oaW50IHMsIGludCBuKXsgcmV0dXJuIHMgKyBwYWlyc1tuXTsgfSk7IAp9Cgp2b2lkIHNvbHZlKCkKewoJaW50IGksbjsKCXN0ZDo6YXJyYXk8c3RkOjp2ZWN0b3I8aW50PixidWNrZXRfbnVtPiBidWNrZXRzOwoJCgljaW4+Pm47CglpbnQgbnVtYmVyOwoJZm9yKGk9MDtpPG47aSsrKQoJewoJICAgIGNpbiA+PiBudW1iZXI7CgkgICAgYnVja2V0c1tudW1iZXIvZGlmZl0ucHVzaF9iYWNrKG51bWJlciVkaWZmKTsKCX0KCQoJaW50IHJlc3VsdCA9IHN0ZDo6YWNjdW11bGF0ZShidWNrZXRzLmJlZ2luKCksIGJ1Y2tldHMuZW5kKCksIDAsCiAgICAgICAgICAgICAgICAgIFtdKGludCBzLCB2ZWN0b3I8aW50PiYgdil7IHJldHVybiBzICsgKHYuc2l6ZSgpKih2LnNpemUoKS0xKSkvMjsgfSk7IAogICAgICAgICAgICAgICAgICAKICAgIGZvcihpbnQgaT0wO2k8YnVja2V0X251bS0xO2krKykKICAgCQlpZihidWNrZXRzW2ldLnNpemUoKSAmJiBidWNrZXRzW2krMV0uc2l6ZSgpKQogICAgCQlyZXN1bHQgKz0gYWRqYWNlbnRfYnVja2V0cyhidWNrZXRzW2ldLCBidWNrZXRzW2krMV0pOwogICAgCQkKICAgIGNvdXQgPDwgcmVzdWx0IDw8IGVuZGw7Cn0KCmludCBtYWluKCkgewoJaW50IFQ7CiAgICBjaW4gPj4gVDsKICAgIGZvciAoaW50IGk9MCA7IGk8VCA7IGkrKykKICAgICAgICBzb2x2ZSgpOwoJcmV0dXJuIDA7Cn0=