Улучшение алгоритма подсчета количества пар, чье побитовое И является степенью 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


Ответы (0 шт):