Ctrl K

Пары с достаточным числом единиц

Сложная
Дан массив положительных целых чисел codes и число need. Упорядоченную пару значений (x, y) назовём **сильной**, если оба значения встречаются в codes и popcount(x OR y) + popcount(x AND y) ≥ need, где popcount — количество единичных битов в двоичной записи, а OR и AND — побитовые «или» и «и». Значения x и y могут совпадать: для пары (x, x) достаточно, чтобы x встретилось в массиве хотя бы раз. Верните количество различных сильных пар. Пары (a, b) и (c, d) различны, если a ≠ c или b ≠ d; в частности, (1, 2) и (2, 1) считаются отдельно. Повторы одного значения в массиве новых пар не дают.
Пример 1
codes=[5, 6, 1], need=4 → 4

В 5 (101) и 6 (110) по две единицы. Для (5, 6): 5 OR 6 = 111, 5 AND 6 = 100, всего 3 + 1 = 4. Подходят (5, 5), (5, 6), (6, 5) и (6, 6); любая пара с 1 даёт не больше 3.

Пример 2
codes=[3, 3, 8], need=3 → 3

Повторы не дают новых пар: значения только 3 и 8. Подходят (3, 3), (3, 8) и (8, 3), а у (8, 8) всего 1 + 1 = 2.

Пример 3
codes=[7], need=7 → 0
Ограничения
  • 1 ≤ len(codes) ≤ 10⁵
  • 1 ≤ codes[i] ≤ 10⁹
  • 1 ≤ need ≤ 60
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиПотерянный билет ЛёгкаяТройки с нулевым AND СложнаяЦепочки с квадратными суммами СложнаяСлова для головоломок СложнаяПогасить все лампы Сложная
загружаем Python…
Вход
codes=[5, 6, 1], need=4
Ожидается
4

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 110 тестов на сервере, включая скрытые.