Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Сочетания с очень большими числами


Автор: UndeadBlow 8.4.2013, 22:16
Всем привет, подскажите, кто сможет: Не могу сообразить, как решить задачу (вычислительно, естественно, не на листке):

Найти все комбинации m по n, при этом m и n могут быть очень большими, вплоть до нескольких тысяч.
Вернуть нужно otvet modulo 1 000 000, соответственно. 
Конечно, просто применить обычную формулу сочетаний с такими числами я не могу, а других вариантов не знаю.

Заранее спасибо.

Автор: Pavia 8.4.2013, 22:26
Файл много страничный.

Автор: UndeadBlow 8.4.2013, 22:50
Спасибо, увы, плюсануть не дает форум, но это то, что нужно.

Автор: Фантом 8.4.2013, 23:03
Цитата(UndeadBlow @  8.4.2013,  23:50 Найти цитируемый пост)
Спасибо, увы, плюсануть не дает форум, но это то, что нужно. 

Сейчас плюсанем.  smile 

Автор: UndeadBlow 9.4.2013, 19:50
Тему можно закрывать, задачу решил. 
Подход из файла товарища Pavia работает. Кратко, общая суть для ленивых:
user posted image
Сокращаем m! снизу и n! сверху. (например снизу 3!, сверху 6!, после сокращения снизу будет 1, сверху 4 * 5 * 6).
Далее раскладываем числитель (уже) и знаменатель на множители. Ищем общий делитель для каждой пары числителя и знаменателя и сокращаем, до тех пор, пока в знаменателе не останутся одни единицы. В рамках этой задачи это возможно всегда.
В итоге останется только последовательность множителей в числителе. Ну, дальше я просто использовал длинную арифметику. Может и есть способ лучше smile

Автор: maxim1000 9.4.2013, 20:41
с http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B5%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA_%D0%9F%D0%B0%D1%81%D0%BA%D0%B0%D0%BB%D1%8F, ИМХО, проще

(естественно, там всё надо считать по модулю)

Автор: UndeadBlow 9.4.2013, 20:58
Цитата(maxim1000 @ 9.4.2013,  20:41)
с http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B5%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA_%D0%9F%D0%B0%D1%81%D0%BA%D0%B0%D0%BB%D1%8F, ИМХО, проще

(естественно, там всё надо считать по модулю)

А как его использовать в данной задаче?

Автор: maxim1000 10.4.2013, 07:55
m-е число в n-й строке треугольника как раз и равно количеству сочетаний из n по m

сам треугольник просто иллюстрирует схему для вычисления количеств сочетаний:

сначала вычисляем одну строку - C(0,0)=1
а на каждой следующей первое и последнее число приравниваем 1, а внутри используем формулу C(n,m)=C(n-1,m)+C(n-1,m-1)

(ну и всё это по модулю)

Автор: UndeadBlow 10.4.2013, 10:38
Цитата(maxim1000 @ 10.4.2013,  07:55)
m-е число в n-й строке треугольника как раз и равно количеству сочетаний из n по m

сам треугольник просто иллюстрирует схему для вычисления количеств сочетаний:

сначала вычисляем одну строку - C(0,0)=1
а на каждой следующей первое и последнее число приравниваем 1, а внутри используем формулу C(n,m)=C(n-1,m)+C(n-1,m-1)

(ну и всё это по модулю)

Обалдеть, не знал о его таких свойствах, нехило smile
Я умею вычислять треугольник Паскаля, огромное вам спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)