61 lines
1.3 KiB
Markdown
61 lines
1.3 KiB
Markdown
|
---
|
||
|
title: Exponentiation
|
||
|
localeTitle: Возведение
|
||
|
---
|
||
|
## Возведение
|
||
|
|
||
|
Для двух целых чисел a и n, напишите функцию для вычисления a ^ n.
|
||
|
|
||
|
#### Код
|
||
|
|
||
|
Алгоритмическая парадигма: разделите и покорите.
|
||
|
|
||
|
```C
|
||
|
int power(int x, unsigned int y) {
|
||
|
if (y == 0)
|
||
|
return 1;
|
||
|
else if (y%2 == 0)
|
||
|
return power(x, y/2)*power(x, y/2);
|
||
|
else
|
||
|
return x*power(x, y/2)*power(x, y/2);
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Сложность времени: O (n) | Космическая сложность: O (1)
|
||
|
|
||
|
#### Оптимизированное решение: O (logn)
|
||
|
|
||
|
```C
|
||
|
int power(int x, unsigned int y) {
|
||
|
int temp;
|
||
|
if( y == 0)
|
||
|
return 1;
|
||
|
temp = power(x, y/2);
|
||
|
if (y%2 == 0)
|
||
|
return temp*temp;
|
||
|
else
|
||
|
return x*temp*temp;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Модульное возведение в степень
|
||
|
|
||
|
Учитывая три числа x, y и p, вычислить (x ^ y)% p
|
||
|
|
||
|
```C
|
||
|
int power(int x, unsigned int y, int p) {
|
||
|
int res = 1;
|
||
|
x = x % p;
|
||
|
while (y > 0) {
|
||
|
if (y & 1)
|
||
|
res = (res*x) % p;
|
||
|
|
||
|
// y must be even now
|
||
|
y = y>>1;
|
||
|
x = (x*x) % p;
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Сложность времени: O (Log y).
|