По трем
натуральным числам x, n и m вычислите
значение xn mod m.
Вход. Три натуральных числа x, n, m (1 ≤ x ≤ 109, 1 ≤ n ≤ 107, 2 ≤ m
≤ 109).
Выход. Выведите одно число – значение xn mod m.
Пример
входа |
Пример
выхода |
2 3 100 |
8 |
возведение
в степень
Возведение в степень – это математическая
операция, обозначаемая как xn, которая
включает два числа: основание x и показатель степени n. Если n –натуральное
число,
то операция возведения в степень сводится к последовательному умножению
основания на само себя: xn – это произведение n множителей,
каждый из которых равен x: xn = x * x
* … * x.
Как вычислить xn по заданным x и n? Можно воспользоваться одним циклом со сложностью O(n). Линейный алгоритм пройдет по времени,
так как n
≤ 107.
Можно также
воспользоваться быстрым возведением в степень:
xn =
Воспользуемся 64
битовым целочисленным типом long long.
Читаем входные данные.
scanf("%lld %lld %lld",&x,&n,&m);
Вычисляем значение
xn mod m при помощи
цикла.
res = 1;
for(i = 1; i <= n; i++)
res = (res * x) % m;
Выводим ответ.
printf("%lld\n",res);
Реализация с помощью быстрого возведения в степень
Функция PowMod вычисляет значение выражения xn mod m.
long long
PowMod(long
long x, long long n, long long m)
{
if (n == 0) return 1;
if (n % 2 ==
0) return PowMod((x * x) % m,
n / 2, m);
return (x * PowMod(x, n - 1, m))
% m;
}
Основная часть программы. Читаем входные
данные.
scanf("%lld %lld %lld",&x,&n,&m);
res = PowMod(x,n,m);
printf("%lld\n",res);
Реализация с помощью классов
#include <stdio.h>
class Long
{
private:
long long value;
public:
static long long mod;
Long() : value(0) {}
Long(long long value) :
value(value) {}
void Read(void)
{
scanf("%lld",&value);
}
static void ReadMod(void)
{
scanf("%lld",&mod);
}
void Print(void)
{
printf("%lld\n",value);
}
bool IsOdd(void)
{
return value & 1;
}
Long operator* (const Long
&x)
{
return (value * x.value) % mod;
}
Long operator/ (const long long &x)
{
return value / x;
}
bool operator== (const long long &x)
{
return this->value
== x;
}
Long operator^ (Long n)
{
Long x(*this);
if (n == 0) return
Long(1);
if (n.IsOdd()) return
x * ((x * x) ^ (n/2));
return (x * x) ^ (n/2);
}
};
long long Long::mod = 0;
int main(void)
{
Long x, n, res;
x.Read();
n.Read();
Long::ReadMod();
res = x ^ n;
res.Print();
return 0;
}
Java реализация – линейная сложность
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
long x = con.nextLong(),
n = con.nextLong(),
m = con.nextLong();
long res = 1;
for(int i = 1; i <= n; i++) res = (res * x) % m;
System.out.println(res);
con.close();
}
}
Java реализация – O(log2n)
import java.util.*;
public class Main
{
static long PowMod(long x, long n, long m)
{
if (n == 0) return 1;
if (n % 2 == 0) return PowMod((x * x) % m, n / 2, m);
return (x * PowMod(x, n - 1, m)) % m;
}
public static void main(String[] args)
{
Scanner
con = new Scanner(System.in);
long x = con.nextLong();
long n = con.nextLong();
long m = con.nextLong();
long res = PowMod(x,n,m);
System.out.println(res);
con.close();
}
}
Java реализация – powMod
import java.util.*;
import java.math.*;
public class Main
{
public static void main(String[] args)
{
Scanner
con = new Scanner(System.in);
BigInteger x = con.nextBigInteger();
BigInteger n = con.nextBigInteger();
BigInteger m = con.nextBigInteger();
System.out.println(x.modPow(n,m));
con.close();
}
}
Java реализация (работа с входными/выходными файлами)
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) throws IOException
{
//Scanner con = new Scanner(System.in);
Scanner con = new Scanner(new FileReader ("273.in"));
PrintWriter out = new PrintWriter(new File("273.out"));
long x = con.nextLong(),
n = con.nextLong(),
m = con.nextLong();
long res = 1;
for(int i = 1; i <= n; i++) res = (res * x) % m;
//System.out.println(res);
out.println(res);
out.flush();
out.close();
}
}
Python реализация – pow
Читаем входные данные.
x, n, m =
map(int, input().split())
Вычисляем и выводим ответ. Используем встроенную функцию pow для вычисления
выражения xn mod m.
print(pow(x, n, m))
Python реализация – цикл
Читаем входные данные.
x, n, m = map(int, input().split())
Вычисляем значение xn mod m при помощи
цикла.
res = 1
for i in range(1, n + 1):
res = (res
* x) % m
Выводим ответ.
print(res)