Last Digit of A ^ B


Submit solution

Points: 100 (partial)
Time limit: 2.0s
Memory limit: 64M

Author:
Problem type
Allowed languages
Ada, BrainF***, C, C#, C++, Dart, Go, Java, JS, Kotlin, Lua, Prolog, Python, Swift, VB

Nestor is doing his math homework, a subject in which he has had many operations that did in the past three days and is very tired. The task is that given two numbers A and B are want to find the last digit of A ^ B. You must help Nestor with this task. Will be given two numbers: the base A (0 < A < 20) and the index B (0 \le B \le 2147483000). You will find the last digit of the result of A ^ B.

Input specification

The first line of the entry contains a number T, the number of test cases. T lines follow. For each test case, a line with A and B separated by a space.

Output specification

For each test case should print a line with the result.

Sample input

2
3 10
6 2

Sample output

9
6

Comments


  • -5
    Maurette  commented on Oct. 1, 2024, 8:31 a.m. edit 5

    This comment is hidden due to too much negative feedback. Show it anyway.


    • 3
      Aicama  commented on Oct. 1, 2024, 7:12 p.m.

      Bro, te pasa lo mismo que te mencioné en un comentario ayer. Esa forma de manejar entradas es incorrecta, ya que estás tomando un input por línea, pero te están dando dos. Un equivalente a tu problema sería:

      n = int(input())
      for _ in range(n):
          a, b = map(int, input().split())
          print((a**b) % 10)
      

      Esto va a dar TLE (Time Limit Exceeded) porque se demora mucho tiempo. Para resolverlo vas a necesitar algo de algoritmia, pero la gran mayoría de problemas de DMOJ toman inputs de la misma forma. En C++, cin maneja las entradas de forma correcta, mientras que en Python input() toma una línea completa.

      Para que tengas un ejemplo claro: si tienes la entrada 3 10 en C++, cada cin se acaba con un espacio. Es decir, si pones:

      cin >> x;
      

      entonces x = 3.

      Pero en Python, input() toma una línea entera, es decir, "3 10". Si intentas tomar dos inputs separados como lo haces aquí:

      a = int(input())
      b = int(input())
      

      obtendrás en el primer input() algo como "3 10", y en el segundo "6 2". Cuando intentes convertir "3 10" a entero, claramente no va a funcionar, ya que no es un valor numérico válido, además de que estarás pidiendo el doble de líneas que las que tiene la entrada. Esto lleva a errores de tipo (IR).

      La forma correcta sería separando lo que tomas en un input() para convertirlo a enteros. Por ejemplo, "3 10" no se puede convertir directamente a entero, pero "3" y "10" sí. Para esto, puedes usar el método split() que convierte un string en un array separado por un delimitador dado. Por ejemplo:

      x = "3,10,5"
      y = x.split(",")
      

      Esto generará y = ["3", "10", "5"], y ahora sí podrías manejar la entrada correctamente.

      Esto pasa con muchos lenguajes de programación que toman como entrada la línea completa. Espero que esta vez haya quedado claro, traté de explicarlo lo mejor que pude.


  • 8
    PedroPabloAB  commented on March 15, 2021, 2:57 a.m.

    Waho. Aniervs, muchas gracias por tu ayuda.


  • 0
    PedroPabloAB  commented on March 14, 2021, 12:48 a.m.

    Pueden darme una pista acerca de cómo resolver este ejercicio.


    • 29
      aniervs  commented on March 15, 2021, 12:13 a.m.

      El problema se puede refrasear como calcular a^b\ \% 10; eso es lo mismo que (a \ \% 10)^b\ \% 10. Ahora que tenemos a \in [0, 10), fácilmente (con fuerza bruta o a lápiz y papel) podemos sacar el ciclo de las potencias de cada número menor que 10, y con eso puedes calcular cualquier potencia rápidamente, por ejemplo: si a\ \% 10 = 2, entonces las potencias de a lucen: 1, 2, 4, 8, 6, 2, 4, 8, 6, 2, 4, 8, 6, 2, \dots, y así sucesivamente.

      Por otro lado, puedes usar un algoritmo básico llamado potenciación rápida. Sabemos que: \displaystyle a^{2n} = (a^2)^n \displaystyle a^{2n+1} = (a^2)^n\cdot a \displaystyle a^0 = 1

      Con esa formulación recursiva puedes calcular a^{n} a partir de a^{\left\lfloor\frac n 2\right\rfloor}; por tanto luego de O(\log_2 n) pasos hallas el resultado. Tener en cuenta que las operaciones aritméticas deben ser realizadas módulo 10.