В последовательности чисел a1, a2,
a3, ... задан первый член,
а остальные вычисляются по формуле:
ai = (ai-1
* ai-1) mod
10000
Найти n-ый член
последовательности.
Вход. В первой строке находятся числа a1 и n (0 ≤ a1
≤ 10000, 1 ≤ n ≤
2000000010).
Выход. Вывести
одно число an.
Пример входа |
Пример выхода |
4 3 |
256 |
возведение
в степень
Выразим первые
члены последовательности через a1:
·
a2 =
a12 mod 10000,
·
a3 =
a22 mod 10000 =
a14 mod 10000,
·
a4 =
a32 mod 10000 =
a24 mod 10000 =
a18 mod 10000
Формулу можно
переписать в виде ai = ai-12
mod 10000, откуда следует что для вычисления an число a1 следует возвести в степень 2n–1 :
Учитывая что ab mod n
= ab mod j(n) mod n, то для нахождения результата res следует произвести следующие вычисления:
x = 2n–1 mod j(10000) =
2n–1 mod 4000,
res = a1x mod 10000
Функция PowMod вычисляет
значение xn mod m.
int
PowMod(int x, int
n, int 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("%d %d",&a,&n);
Вычисляем x = 2n–1 mod 4000, после чего находим и выводим ответ
res = ax mod 10000
x
= PowMod(2,n-1,4000);
res
= PowMod(a,x,10000);
printf("%d\n",res);
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 a = con.nextLong();
long n = con.nextLong();
long x = PowMod(2,n-1,4000);
long res = PowMod(a,x,10000);
System.out.println(res);
con.close();
}
}