Ответы пользователя по тегу Математика
  • Как найти все возможные не повторяющиеся пересечения множеств?

    Как я понимаю, общих элементов нет.
    На примере 3-х множеств с мощностями a, b и c.
    m=0: 1 комбинация
    m=1: a + b + c комбинаций
    m=2: a*b + b*c + a*c комбинаций
    m=3: a*b*c комбинаций

    Итого
    1 + a + b + c + ab + bc + ca + abc
    1 + a + b + ab + c*(1 + a + b + ab)
    (1 + a + b + ab)(1 + c)
    ...
    (1 + a)(1 + b)(1 + c)

    На ваших данных получаем 4*3*3 = 36

    Ответ подсказывает и принцип, как его посчитать. Из одного множества можно выбрать 1 + a способами: либо не берём (пустое множество), либо берём a способами.
    Если добавить новое множество в рассмотрение, то либо мы из него не берём элемент, либо тоже берём, b способами, итого: (1+a)(1+b). Т.е. каждое множество Aᵢ даёт нам 1+|Aᵢ| новых вариантов, где |A| - мощность (кол-во элементов) множества A.
    Т.о. ответ: ∏(1+|Aᵢ|)

    Учтите, что эта формула учитывает так же и единственный вариант выбрать 0 элементов (результат - пустое множество), соот-но от того, что вы посчитали в вопросе отличается на единицу (36 вместо 35).
    Ответ написан
  • Как быстро выбрать все сочетания из массива (комбинаторика)?

    > [(i, j) for i in range(1, 4) for j in range(i + 1, 4)]
    [(1, 2), (1, 3), (2, 3)]


    Более общий код, но на хаскеле.
    Идея такая:
    Для каждого элемента списка получаем n-1 сочетания из всех, что идут после него, и добавляем сам элемент.
    comb ∷ Int → [a] → [[a]]
    comb 0 _ = [[]] -- из нуля элементов можно составить только пустой список
    comb n [] = [] -- из пустого списка нельзя составить ничего
    comb n lst = do -- списочная монада, работает как вложенные for
    	-- tails для [1,2,3] вернёт [[1,2,3], [2,3], [3], []], т.е. все возможные хвосты
    	-- мы перебираем все хвосты, кроме последнего пустого
    	-- и дербаним его на голову l и остаток ls
    	(l:ls) ← filter (not ∘ null) $ tails lst
    	-- перебираем сочетания из n - 1 элементов от ls
    	ls' ← comb (n - 1) ls
    	-- и присобачиваем l к каждому
    	return (l:ls')
    Ответ написан
    4 комментария
  • Какая математическая формула?

    1 + 2 + 4 + ... = 2⁰ + 2¹ + 2² + ... = 2ⁿ - 1
    (2ⁿ - 1)x = 100
    x = 100 / (2ⁿ - 1)

    Где x - выигрыш последнего выигрышного места

    Например при 4 участниках x = 100 / (2⁴ - 1) = 100 / 15
    Выигрыши: 100/15, 2*100/15, 4*100/15, 8*100/15
    Ответ написан
    Комментировать
  • Как посчитать числа кратные двум числам?

    Разложите на множители
    1920 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 3 * 5
    600 = 2 * 2 * 2 * 3 * 5 * 5

    Общие множители: 2, 2, 2, 3, 5
    Сколько можно составить чисел из них, перемножая? Двойку можно взять от нуля до 3-х раз, т.е. 4 способа. Для 3 и 5 - по два способа (взять или не брать), итого 4 * 2 * 2 = 16 чисел, включая число 1 (все множители берём 0 раз).
    Вот эти числа: 1, 2, 2*2, 2*2*2, 3, 3*2, 3*2*2, 3*2*2*2, 5, 5*2, 5*2*2, 5*2*2*2, 3*5, 3*5*2, 3*5*2*2, 3*5*2*2*2.
    Ответ написан
    1 комментарий
  • Сколько чисел, не превосходящих 240, которые не делятся ни на 2, ни на 3, ни на 5?

    Посчитать те, которые делятся хотя бы на одно. При этом надо учитывать, что некоторые числа будут посчитаны несколько раз. Надо воспользоваться формулой включений-исключений.
    Итого делящихся хотя бы на одно из этих чисел:
    240/2 + 240/3 + 240/5 - 240/(2*3) - 240/(2*5) - 240/(3*5) + 240/(2*3*5) = 176
    Значит, неделящихся 240 - 176 = 64

    Проверяем:
    ghci> length $ filter (\x -> 0 `notElem` [x `mod` 2, x `mod` 3, x `mod` 5]) [1..240]
    64
    Ответ написан
    Комментировать
  • Как математически описать перебор кода из 7 цифр?

    На хаскелях отвечу

    codes = [c |
        c <- replicateM 7 [1..4],
        length (nub $ sort c) >= 2, -- как минимум 2 цифры используется
        all ((>= 2) . length) $ group $ sort c] -- каждой цифры минимум 2 штуки
    Ответ написан
    Комментировать