input=<исходный массив N чисел>
// сначала ищем максимальный элемент
max = input[0]
min = input[0]
for (i = 1...N-1) do:
if (input[i] > max) then:
max = input[i]
if (input[i] < min) then:
min = input[i]
// определяем смещение
shift = min
// создаем реверс-массив
countArrSz = max - min + 1
countArr = new array size of [countArrSz]
// заполняем его нулями на начальном этапе
for (j = 0...countArrSz) do:
countArr[j] = 0
// далее проходимся по всем числам и подсчитываем одинаковые
for (i = 0...N-1) do:
v = input[i]
countIndex = v - shift
countArr[countIndex] = countArr[countIndex] + 1
// В конце по формуле перестановок считаем
result = 0
for (j = 0...countArrSz) do:
count = countArr[j]
if (count > 1) then:
result = result + (count - 1) * count / 2
return result // возвращаем искомое количество