Ardıcıllıq#1083

Ardıcıllıq (Həll təhlili)

Ardıcıllığın ilk hədlərini a_1 vasitəsilə ifadə edək:

Beləliklə, düsturu aşağıdakı şəkildə yazmaq olar:

a_i = a_{i-1}^2~mod~10000

Buradan belə nəticə çıxır ki, a_n-i hesablamaq üçün a_1-i 2^{n - 1} dərəcəsinə modulu ilə qaldırmaq kifayətdir:

a_n = a_1^{2^{n-1}}~mod~10000

Nəzərə alsaq ki,

a^b~mod~n = a^{b~mod~\phi(n)}~mod~n,

nəticəsini əldə etmək üçün aşağıdakı hesablamaları yerinə yetirmək lazımdır:

Alqoritmin realizasiyası

PowMod funksiyası x^n~mod~m qiymətini hesablayır.

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;
}

Giriş məlumatlarını oxuyuruq.

scanf("%d %d",\u0026a,\u0026n);

x = 2^{n - 1}~mod~4000 hesablayırıq. Bundan sonra cavabı tapıb çap edirik:

res = a^x~mod~10000
x = PowMod(2,n-1,4000);
res = PowMod(a,x,10000);
printf("%d\n",res);

Java realizasiyası

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();
  }
}