Как вычислить (xy) по модулю z, если 1 ‹= x, y ‹= 101000 и z любое положительное целое число 1 ‹= z ‹ 231< /суп> ?
До сих пор я делал следующее: сканировал x и y как строку, получал по модулю, затем вычислял (xy) по модулю z.
Я знаю, что это неправильно, потому что (xy) mod z не равно ((x mod z)(y mod z)) mod z. Тогда как мне это решить?
Изменить: извините, я сделал нижнее ограничение x и y таким высоким при создании вопроса. Я просто хочу сосредоточиться на большой целочисленной проблеме, а не на модульном возведении в степень :).
#define MOD z
long long power (long long k, long long n) {
if (n == 1) return k;
else {
long long p = power (k, n/2);
if (n % 2 == 0) return (p * p) % MOD;
else return (((p * p) % MOD) * k) % MOD;
}
}
long long convert (char *n) {
long long number = 0;
int ln = strlen (n);
for (int x = 0; x < ln; x++) {
number = number * 10;
number = (number + (n[x] - '0')) % MOD;
}
return number % MOD;
}
int main () {
char s_x[1111], s_y[1111];
scanf ("%s %s", s_x, s_y);
long long x, y, r;
x = convert (s_x);
y = convert (s_y);
r = power (x, y);
printf ("%lld\n", r);
}
z
. Странно показывать диапазонx
иy
, но неz
. По крайней мере, один ответ предполагал определенный диапазон, сильно упрощая задачу, и вы не уточнили, верно ли это предположение. Пожалуйста, отредактируйте свой вопрос, чтобы прояснить этот момент. - person anatolyg   schedule 05.10.2016