Дано целое число a, b, m. Найдите (a * b) mod m, где a, b могут быть большими, и их прямое умножение может вызвать переполнение. Однако они меньше половины максимально допустимого значения long long int.
Примеры:
Input: a = 426, b = 964, m = 235 Output: 119 Explanation: (426 * 964) % 235 = 410664 % 235 = 119 Input: a = 10123465234878998, b = 65746311545646431 m = 10005412336548794 Output: 4652135769797794
Наивный подход состоит в том, чтобы использовать тип данных произвольной точности, такой как int в python или класс Biginteger в Java. Но такой подход не будет плодотворным, поскольку внутреннее преобразование строки в int и последующая операция приведут к замедлению вычислений сложения и умножения в двоичной системе счисления.
Эффективное решение: так как a и b могут быть очень большими числами, если мы попытаемся умножить непосредственно, тогда это определенно переполнится. Поэтому мы используем базовый подход умножения, т. Е.
a * b = a + a +… + a (b раз)
Таким образом, мы можем легко вычислить значение сложения (по модулю m) без каких-либо
переполнение в расчете. Но если мы попытаемся добавить значение a многократно до b раз, то это определенно приведет к превышению времени ожидания для большого значения b, поскольку временная сложность этого подхода станет O (b).
Таким образом, мы делим вышеупомянутые повторные шаги более простым способом, т.е.
If b is even then a * b = 2 * a * (b / 2), otherwise a * b = a + a * (b - 1)
Ниже представлен подход, описывающий приведенное выше объяснение:
|
С
|
Джава
|
Python 3
|
C #
|
PHP
|
Выход:
4652135769797794
Временная сложность: O (log b)
Вспомогательное пространство: O (1)
Примечание. Приведенный выше подход будет работать только в том случае, если 2 * m можно представить в стандартном типе данных, в противном случае это приведет к переполнению.
Эта статья предоставлена Shubham Bansal . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Рекомендуемые посты:
- По модулю большой двоичной строки
- Умножение больших чисел в виде строк
- Умножьте большие числа, используя метод сетки
- Мощность по модулю для больших чисел, представленных в виде строк
- GCD из двух чисел, когда одно из них может быть очень большим
- Найдите (a ^ b)% m, где «a» очень большое
- Сумма двух больших чисел
- Найдите (a ^ b)% m, где «b» очень большое
- LCM двух больших чисел
- Сравнение X ^ Y и Y ^ X для очень больших значений X и Y
- Делится на 37 для больших чисел
- Разница двух больших чисел
- Найти N% 4 (остаток с 4) для большого значения N
- Делимость на 12 для большого числа
- Суммирование рядов, если задано T (n) и n очень большое
0.00 (0%) 0 votes