8654. Целочисленное умножение
Даны три целых числа a, b,
c. Вычислите значение выражения a ∗ b mod c.
Вход. Три
целых положительных числа a, b, c (a, b, c
< 263).
Выход. Выведите
значение выражения a ∗ b mod c.
Пример
входа |
Пример
выхода |
1000000000007 10000000000005 1000000000000003 |
74970000000035 |
рекурсия
Задачу можно решить при помощи длинной арифметики на языке Java или Python. Однако здесь мы рассмотрим как
решить задачу средствами языка программирования Си.
Пусть f(a, b, c) = (a ∗ b) mod c. Для
вычисления функции воспользуемся рекурсией по аргументу b.
·
Если b = 0, то (a ∗ 0) mod c = 0.
·
Если b четно, то (a ∗ b) mod c = ((2 * a) mod
c ∗ (b / 2)) mod c
·
Если b нечетно, то (a ∗ b) mod c = (a ∗ (b – 1) + a) mod c
Таким образом
Поскольку a, b,
c < 263, а при
вычислениях используется только умножение на 2, то 2a < 264, что помещается в беззнаковый
64 битный тип unsigned long long.
Реализуем
функцию mult умножения двух чисел a и b по модулю c.
unsigned long long mult(unsigned long long a, unsigned long long b,
unsigned long long c)
{
if (b == 0) return 0;
if (b % 2 == 0) return mult((2 * a) % c, b / 2, c);
return (mult(a, b - 1, c) + a) % c;
}
Основная часть программы. Читаем входные данные.
scanf("%lld %lld %lld", &a,
&b, &c);
Вычисляем и выводим ответ.
res = mult(a, b, c);
printf("%lld\n", res);