O último dígito em uma exponenciação


14

Nesta tarefa, você receberá A (menos de 10000 dígitos) e B (menos de 2 ^ 64) e precisará calcular o último dígito de (A · A · A · ... · A (B vezes )).

As entradas A e B são fornecidas em uma única linha separada por um espaço em branco; as entradas são finalizadas pelo EOF.

Entrada

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Resultado

6
3
5
9

Restrições

  • Não use nenhuma função embutida ou operadores sobrecarregados para calcular AB (você realmente não precisa calcular isso).
  • A solução mais curta vence!

2
É permitido usar o operador de exponenciação para calcular outras coisas que não A ** B?
Lowjacker

Presumo que A e B não sejam negativos?
Aaaaaaaaaaaa 28/03

Respostas:


9

J - 52 caracteres

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

Passa em todos os testes fornecidos, embora apenas se os espaços à direita na terceira entrada forem removidos (acho que isso não foi intencional).

A solução funcionará no j602 no modo de console (por exemplo, no terminal, emacs j-shell, etc.). Não funcionará no j701 (não wd).

Explicação e maturidade:

O 'número mágico' 12 é o LCM dos comprimentos das tabelas do "último dígito" encontrados nas outras respostas. Todos os dígitos se repetem com os períodos 1,2,3 ou 4, portanto, também se repetem com o período 12. Adicionando doze aos casos em que b mod 12 = 0. Minha solução calcula (último dígito de A) ^ (12+ (mod B 12)), fornecendo um número com o mesmo último dígito. (Eu considerei uma solução quebrada furtiva eliminando os três caracteres '12 + 'usando, por exemplo, B mod 96, onde nenhum exemplo provavelmente colidiria ...)


6

Python 125 107 Chars

Solução O (1)

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]

Nice +1.
Quixotic

6

GolfScript 21

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

Isso basicamente calcula A^C mod 10onde C está no intervalo [1,4]e C mod 4 = B mod 4, exceto se B for 0, C também será 0.

Esse atalho é possível porque A^(B+4) mod 10 = A^B mod 10para qualquer número inteiro não negativo A e número inteiro positivo B.


5

J, 79

,._2(4 :'10|x^(+y&(|~))x{10$1 1 4 4 2')/\x:".(]_1&{.`];._2~(' ',LF)e.~])(1!:1)3

Uau, isso é feio! Lembre-me de não aprender este idioma. +1 para aturar isso.
Caleb

5

Ruby, 97 93 72 71 67 61 60

Também lida com o caso em que b == 0.

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

Acho que é realmente pior usar uma tabela de pesquisa.


Ele fornece 1 como saída ao fornecer 2 5como entrada e nem fornece saída correta para os casos de amostra acima. ideone.com/2cOPy
fR0DDY 27/03

1
@ fR0DDY: Funciona perfeitamente no meu sistema, com 1.9.2 também.
Lowjacker

4

Windows PowerShell, 85

Solução O (1). Peguei uma dica da solução Ruby do Lowjacker ;-)

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

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])]

3

Python ( 119 134 109)

Confio que a proibição de funções internas não se aplique à E / S.

sys de importação
p = lambda b, e: eep (b * b% 10, e / 2) * (~ e & 1 ou b)% 10 ou 1
para l em sys.stdin: print p (* map (int, l.split ()))

Editar: remova o uso do operador de exponenciação do Python.

Edit: operadores ternários substituídos por operadores booleanos em curto-circuito.


Sim, você pode / deve usar as funções de E / S para receber as entradas, mas não deve usar '**' para esta tarefa.
Quixotic

Isso funcionaria, mas eu realmente não pretendo essa tarefa para uma solução de exponenciação modular de força bruta; na verdade, existe um algoritmo O (1) e é muito curto também :-)
Quixotic

2

Python 3k

121 Chars

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))

O (a*a)%10não é necessário, mas acelera, então decidimos mantê-lo.

Editar: Aparentemente, os parênteses não são necessários.

Enquanto isso, pensando na O(1)solução. :)


Não será o erro de loop após o EOF?
Hoa Long Tam

2

Javascript ( 117 84 79 60 caracteres)

Atingiu 60 caracteres com as melhorias sugeridas em @JiminP e @NoOneIsHere. Obrigado!

d = função (s, n) {a = Math.pow (s [s.length-1], n% 4 == 0? 1: n% 4) + ''; retorna a [a.length-1] }

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

Testar:

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

1
d=function(s,n){return(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)}: P
JiminP 28/03

1
Eu não uso muito JavaScript, mas você não pode usar d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)ou usar =>?
NoOneIsHere
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.