El último dígito en una exponencia

14

En esta tarea se le dará A (menos de 10000 dígitos de largo) y B (menos de 2 ^ 64), y deberá calcular el último dígito de (A · A · A · ... · A (B veces )).

Las entradas A y B se dan en una sola línea separada por un espacio en blanco; las entradas son terminadas por EOF.

Entrada

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Salida

6
3
5
9

Restricciones

  • No utilice ninguna función incorporada ni operadores sobrecargados para calcular A B (realmente no necesita calcular eso en absoluto).
  • ¡La solución más corta gana!
Quijotesco
fuente
2
¿Está permitido usar el operador de exponenciación para calcular cosas que no sean A ** B?
Lowjacker
¿Supongo que tanto A como B no son negativos?
aaaaaaaaaaaa

Respuestas:

9

J - 52 caracteres

wd,.10|(^12+12&|)/"1(".@{:`".;._2@,&'x ');._2(1!:1)3

Pasa todas las pruebas dadas, aunque solo si se eliminan los espacios finales en la tercera entrada (supongo que esto no fue intencional).

La solución funcionará en j602 en modo consola (por ejemplo, en terminal, emacs j-shell, etc.). No funcionará en j701 (no wd).

Explicación y Matemáticas:

El 'número mágico' 12 es el MCM de las longitudes de las tablas de "último dígito" que se encuentran en las otras respuestas. Todos los dígitos se repiten con los períodos 1,2,3 o 4, por lo que también se repetirán con el período 12. Sumar doce a eso corrige los casos en que b mod 12 = 0. Mi solución calcula (Último dígito de A) ^ (12+ (B mod 12)), dando un número con el mismo último dígito. (Considere una solución disimulada que elimina los tres caracteres '12 + 'usando, por ejemplo, B mod 96 donde no es probable que colisionen ejemplos ...)

Jesse Millikan
fuente
6

Python 125 107 Chars

O (1) solución

while 1:a,b=map(int,raw_input().split());d=1;exec"d*=a;"*(b%4);c=a%5and d%5;print b/~b+1or c+[0,5][c%2-a%2]
fR0DDY
fuente
Niza +1.
Quixotic
6

GolfScript 21

~]2/{~.(4%)and?10%n}/

Básicamente, esto calcula A^C mod 10dónde está C en el rango [1,4]y C mod 4 = B mod 4, excepto si B es 0, entonces C también es 0.

Este acceso directo es posible porque A^(B+4) mod 10 = A^B mod 10para cualquier número entero no negativo A y número entero positivo B.

aaaaaaaaaaaa
fuente
5

J, 79

,._2(4 :'10|x^(+y&(|~))x{10$1 1 4 4 2')/\x:".(]_1&{.`];._2~(' ',LF)e.~])(1!:1)3
Eelvex
fuente
Wow eso es feo! Recuérdame que no aprenda este idioma. +1 por aguantarlo.
Caleb
5

Rubí, 97 93 72 71 67 61 60

También maneja el caso donde b == 0.

#!ruby -nl
~/ /
p eval"#$`%10*"*($'>?0?($'.to_i-1)%4+1:0)+?1

Supongo que en realidad es peor usar una tabla de búsqueda.

Lowjacker
fuente
Da 1 como salida al dar 2 5como entrada y ni siquiera da la salida correcta para los casos de muestra anteriores. ideone.com/2cOPy
fR0DDY
1
@ fR0DDY: Funciona perfectamente en mi sistema, con 1.9.2 también.
Lowjacker
4

Windows PowerShell, 85

O (1) solución. Tomó una pista de la solución Ruby de Lowjacker ;-)

$input|%{$a,$b=-split$_
'0000111162481397646455556666179368421919'[4*$a[-1]%48+$b%4]}
Joey
fuente
3

Python 149 Chars

p=[[0],[1],[6,2,4,8],[1,3,9],[6,4],[5],[6],[1,7,9,3],[6,8,4,2],[1,9]]
while 1:a,b=map(int,raw_input().split());print b/~b+1or p[a%10][b%len(p[a%10])]
fR0DDY
fuente
3

Pitón ( 119 134 109)

Confío en que la prohibición de las funciones integradas no se aplica a E / S.

sys de importación
p = lambda b, e: e y p (b * b% 10, e / 2) * (~ e & 1 o b)% 10 o 1
para l en sys.stdin: print p (* map (int, l.split ()))

Editar: eliminar el uso del operador de exponenciación de Python.

Editar: operadores ternarios reemplazados por operadores booleanos en cortocircuito.

Hoa Long Tam
fuente
Sí, puede / debe usar las funciones de E / S para tomar las entradas, pero no debe usar '**' para esta tarea.
Quixotic
Sin embargo, esto funcionaría, pero realmente no tengo la intención de esta tarea para una solución de exponenciación modular forzada por la fuerza bruta, en realidad hay un algoritmo O (1) y también es muy corto :-)
Quixotic
2

Python 3k

121 caracteres

def p(a,b):
  if b<1:return 1
  return p(a*a%10,b//2)*[1,a][b%2]%10
while 1:
  a,b=map(int,input().split())
  print(p(a%10,b))

El (a*a)%10no es necesario pero lo acelera, por lo que decidió mantenerlo.

Editar: Aparentemente, los paréntesis no son obligatorios.

Mientras tanto, pensando en la O(1)solución. :)

st0le
fuente
¿No aparecerá el error de bucle después del EOF?
Hoa Long Tam
2

Javascript ( 117 84 79 60 caracteres)

Alcanzó 60 caracteres con las mejoras sugeridas de @JiminP y @NoOneIsHere. ¡Gracias!

d = función (s, n) {a = Math.pow (s [s.length-1], n% 4 == 0? 1: n% 4) + ''; devuelve a [a.length-1] }

d=(s,n)=>{return(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)}

Probar:

console.log(d('243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222', 22337254775808));
console.log(d('38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357', 54545454123));
console.log(d('6777744348435743587643756438765436574587564354375674365645643675', 23232));
console.log(d('3875843654376574357', 54545454));

Resultados:

2
3
5
9
Stephen Perelson
fuente
1
d=function(s,n){return(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)}: P
JiminP
1
No uso mucho JavaScript, pero ¿no podrías usarlo d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)o no usarlo =>?
NoOneIsHere