Улучшение алгоритма подсчета количества пар, чье побитовое И является степенью 2
Как можно улучшить алгоритм считающий количество неупорядоченных пар в массиве, чье побитовое И является степенью 2? Например, если массив равен [10,7,2,8,3]. Ответ 6. Объяснение:
10 & 7 = 2
10 & 2 = 2
10 & 8 = 8
10 & 3 = 2
7 & 2 = 2
2 & 3 = 2
Я вывел решение имеющее сложность O(Nˆ2):
$count = 0;
$len = count($arr);
for($i = 0; $i < ($len - 1); $i++){
for($j = ($i + 1); $j < $len; $j++){
$calc = $arr[$i] & $arr[$j];
if( $calc && (!($calc & ($calc - 1))) )
$count++;
}
}
echo $count;
Но проблема в том, что уже на 10000 элементах оно выдает около 3 секунд времени и на больших рядах я получаю time limit error на той платформе, где провожу тестирование. Как можно усовершенствовать данный алгоритм?
UPD: Размер массива не более 10ˆ5 элементов, размер чисел не более 10ˆ9