Определить количество комбинаций, подходящих под условия
Определите количество шестизначных чисел, записанных в восьмеричной системе счисления, в записи которых есть ровно две цифры 6, при этом никакая нечётная цифра не стоит рядом с цифрой 6.
Как проще и легче реализовать проверку на соответствия условиям? (без прямого перебора условий комбинациями)
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
X - чётная цифра, но не 6 (0, 2, 4) - три штуки Y - любая цифра, но не 6 (0, 1, 2, 3, 4, 5, 7) - семь штук x - чётная цифра, но не 6 и не 0 (2, 4) - две штуки y - любая цифра, но не 6 и не 0 (1, 2, 3, 4, 5, 7) - шесть штук
число количество 66XYYY 1 * 1 * 3 * 7 * 7 * 7 = 1029 6X6XYY 1 * 3 * 1 * 3 * 7 * 7 = 441 6XX6XY 1 * 3 * 3 * 1 * 3 * 7 = 189 6XYX6X 1 * 3 * 7 * 3 * 1 * 3 = 189 6XYYX6 1 * 3 * 7 * 7 * 3 * 1 = 441 x66XYY 2 * 1 * 1 * 3 * 7 * 7 = 294 x6X6XY 2 * 1 * 3 * 1 * 3 * 7 = 126 x6XX6X 2 * 1 * 3 * 3 * 1 * 3 = 54 x6XYX6 2 * 1 * 3 * 7 * 3 * 1 = 126 yX66XY 6 * 3 * 1 * 1 * 3 * 7 = 378 yX6X6X 6 * 3 * 1 * 3 * 1 * 3 = 162 yX6XX6 6 * 3 * 1 * 3 * 3 * 1 = 162 yYX66X 6 * 7 * 3 * 1 * 1 * 3 = 378 yYX6X6 6 * 7 * 3 * 1 * 3 * 1 = 378 yYYX66 6 * 7 * 7 * 3 * 1 * 1 = 882
Всего 5229.
Проверка:
import math
six = set((6, ))
odds = set(range(1, 8, 2))
s = 0
for i in range(6):
for j in range(i + 1, 6):
n = [set(range(1, 8)) - six] + [set(range(8)) - six for _ in range(5)]
n[i] = six
n[j] = six
if i > 0:
n[i - 1] -= odds
if i < 5:
n[i + 1] -= odds
if j > 0:
n[j - 1] -= odds
if j < 5:
n[j + 1] -= odds
p = math.prod(map(len, n))
print(*map(len, n), sep=' * ', end=' = ')
print(f'{p:4}')
s += p
print(s)
$ python check.py 1 * 1 * 3 * 7 * 7 * 7 = 1029 1 * 3 * 1 * 3 * 7 * 7 = 441 1 * 3 * 3 * 1 * 3 * 7 = 189 1 * 3 * 7 * 3 * 1 * 3 = 189 1 * 3 * 7 * 7 * 3 * 1 = 441 2 * 1 * 1 * 3 * 7 * 7 = 294 2 * 1 * 3 * 1 * 3 * 7 = 126 2 * 1 * 3 * 3 * 1 * 3 = 54 2 * 1 * 3 * 7 * 3 * 1 = 126 6 * 3 * 1 * 1 * 3 * 7 = 378 6 * 3 * 1 * 3 * 1 * 3 = 162 6 * 3 * 1 * 3 * 3 * 1 = 162 6 * 7 * 3 * 1 * 1 * 3 = 378 6 * 7 * 3 * 1 * 3 * 1 = 378 6 * 7 * 7 * 3 * 1 * 1 = 882 5229