Вам дано N разных номеров. Перед вами стоит задача найти количество групп из 2 или 3, которые можно сформировать, сумма которых делится на три.
Примеры :
Input : 1 5 7 2 9 14 Output : 13 The groups of two that can be formed are: (1, 5) (5, 7) (1, 2) (2, 7) (1, 14) (7, 14) The groups of three are: (1, 5, 9) (5, 7, 9) (1, 2, 9) (2, 7, 9) (2, 5, 14) (1, 9, 14) (7, 9, 14) Input : 3 6 9 12 Output : 10 All groups of 2 and 3 are valid.
Наивный подход: для каждого числа мы можем сложить его с любым другим числом и посмотреть, делится ли сумма на 3. Затем мы сохраняем эти суммы, чтобы мы могли снова добавить каждое число, чтобы проверить группы по три.
Сложность времени: O (N ^ 2) для групп из 2, O (N ^ 3) для групп из 3
Вспомогательное пространство: O (N ^ 2)
Оптимальный подход
Если мы внимательно посмотрим на каждое число, мы поймем, что существует 3 варианта:
- Число делится на 3
- Число оставляет остаток от 1, когда делится на 3
- Число оставляет остаток от 2, когда делится на 3
Теперь, когда группы из двух делятся на 3, либо оба числа должны принадлежать категории 1 (оба делятся на 3), либо одно число должно оставить остаток 1, а другой остаток 2. Таким образом, остатки складываются до 3, делая сумму, делимую на 3.
Чтобы сформировать группу из трех, либо все три числа должны давать одинаковый остаток, либо одно должно давать остаток 0, другое должно давать 1, а последнее должно давать 2.
Таким образом, мы заботимся не о самих числах, а об их соответствующих остатках. Таким образом, сгруппировав их по трем категориям, мы можем найти все возможные группы, используя простую формулу.
Пусть C1 число элементов, делимых на 3.
Пусть C2 будет количеством элементов, оставшихся от остатка 1.
Пусть C3 будет количеством элементов, оставшихся от остатка 2.
Answer = C2 * C3 + C1 * (C1 - 1) / 2 --> Groups of 2 + C1 * (C1 - 1) * (C1 - 2) / 6 + C2 * (C2 - 1) * (C2 - 2) / 6 + C3 * (C3 - 1) * (C3 - 2) / 6 --> Groups of 3 with elements of same remainder + C1 * C2 * C3 --> Groups of three with all distinct remainders
|
Джава
|
python3
|
C #
|
PHP
|
Выход :
13 10
Спросил в Амазонке
Эта статья предоставлена Адитьей Каматом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Количество способов распределения N идентичных объектов в R различных группах без групп пустых
- Подсчитайте количество пар (i, j), так что либо arr [i] делится на arr [j], либо arr [j] делится на arr [i]
- Количество способов распределения N идентичных объектов в R различных группах
- Количество способов разбить двоичное число таким образом, чтобы каждая часть делилась на 2
- Количество цифр, которые нужно удалить, чтобы число делилось на 3
- Проверьте, делится ли число на все простые делители другого числа
- Найти, если число делится на каждое число в списке
- Число делится на 29 или нет
- Количество делителей данного числа N, которые делятся на K
- Проверьте, делится ли число на 23 или нет
- Перестановка числа, которое тоже делится на него
- Умножьте данное число на 2 так, чтобы оно делилось на 10
- Количество подмножеств с суммой, кратной M | Набор 2
- Проверьте, делится ли число на 41 или нет
- Количество подстрок делится на 8, но не на 3
0.00 (0%) 0 votes