Я пытаюсь решить предварительные задачи конкурса по программированию, и для двух задач мне нужно вычислить и вывести несколько очень больших целых чисел (например, 100 !, 2 ^ 100).
Мне также нужен быстрый способ для вычисления степеней этих больших целых чисел.
Можете ли вы посоветовать мне некоторые алгоритмы или структуры данных для этого? (Кстати, я прочитал раздел "Интерфейсы и реализации C" арифметики произвольной точности, но это не помогает для pow ())
РЕДАКТИРОВАТЬ: Я думаю, что возведение в степень методом возведения в квадрат и сдвигом битов будет работать на мощность, но мне также нужен быстрый способ для вычисления факториалов для этих целых. Спасибо.
EDIT2: для тех, кто заинтересован;
Найдите самую короткую длину строки битов, которая включает все строки битов с длиной N (извините за мой английский, я приведу пример). N <= 10000 </p>
Например, длина самой короткой битовой строки, которая включает все битовые строки длины 2 (00, 01, 10, 11), равна 5 (11001).
Мое решение для этой проблемы было 2 ^ n + n - 1. (поэтому я должен рассчитать степени 2, я думаю, что я буду использовать сдвиг битов)
Другая проблема заключается в том, что, учитывая 2 длины, выясните, как разными способами вы можете достичь длины N. Например, входное значение равно 10, 2, 3. Затем вы должны достичь 10 с помощью 2 и 3 (например, , 2 + 2 + 2 + 2 + 2, 2 + 2 + 3 + 3, 3 + 2 + 2 + 3, 3 + 3 + 2 + 2 ...). 1 <= N <2 ^ 63. Рассчитаем ответ в моде 1000000007. </p>
Мое решение было: 2x + 3y = N, поэтому x = (N - 3y) / 2. Для y от 0 до 2 * N / 3, если x является целым числом, тогда я должен вычислить обобщенную перестановку для этих X и Y, всего + = (x + y)! / (х! * у!).