All streams
Search
Write a publication
Pull to refresh
0
0
Send message

Что интересно, эту задачу можно решить намного оптимальнее, чем предложено как в статье, так и в других комментариях (я не нашёл чего-то существенно лучше O(n^2)): например, за O(n \log^2 n).

Для формальности пусть наш кубик будет не обычный игральный, а с числами 1, 2, \ldots, d.

Заметим, что нам достаточно найти f(n, k) – количество способов набрать сумму k, после n бросков. Тогда вероятность можно получить, разделив f(n, k) на d^k.

Подставив разные результаты выпадения последнего кубика, получаем f(n, k) = f(n - 1, k - 1) + f(n - 1, k - 2) + \ldots + f(n - 1, k - d).

Заметим, что f(n, k) это просто коэффициент многочлена (x + x^2 + x^3 + \dots + x^d)^n при x^k.

Я не умею эффективно находить в отдельности k-й коэффициент, поэтому давайте найдём многочлен целиком.

Для этого воспользуемся бинарным возведением в степень: это позволит нам найти искомый многочлен всего за O(\log n) перемножений многочленов. Перемножать многочлены можно при помощи быстрого преобразованием Фурье за O(n \log n).
Итоговая асимптотика: O(n \log^2 n).

С небольшими изменениями это же решение можно использовать для кубиков разных размеров (например, для x бросков d125 и y бросков d512).

Information

Rating
Does not participate
Registered
Activity