Ostatnia cyfra w potęgowaniu


14

W tym zadaniu otrzymasz A (mniej niż 10000 cyfr) i B (mniej niż 2 ^ 64) i będziesz musiał obliczyć ostatnią cyfrę (A · A · A · ... · A (B razy )).

Wejścia A i B podano w jednym wierszu oddzielonym spacją; wejścia są zakończone przez EOF.

Wejście

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Wynik

6
3
5
9

Ograniczenia

  • Nie używaj żadnej wbudowanej funkcji ani przeciążonych operatorów do obliczania A B (tak naprawdę wcale nie musisz tego obliczać).
  • Najkrótsze rozwiązanie wygrywa!

2
Czy wolno używać operatora potęgowania do obliczania rzeczy innych niż A ** B?
Lowjacker

Zakładam, że zarówno A, jak i B są nieujemne?
aaaaaaaaaaaa

Odpowiedzi:


9

J - 52 znaki

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

Przechodzi wszystkie podane testy, ale tylko wtedy, gdy końcowe spacje na trzecim wejściu zostaną usunięte (domyślam się, że było to niezamierzone).

Rozwiązanie będzie działać w j602 w trybie konsoli (np. W terminalu, emacs j-shell itp.). To nie będzie działać w j701 (niewd ).

Wyjaśnienie i matematyka:

„Magiczna liczba” 12 to LCM długości tabel „ostatniej cyfry” znalezionych w innych odpowiedziach. Wszystkie cyfry powtarzają się z kropkami 1, 2, 3 lub 4, więc będą się powtarzać również z kropką 12. Dodanie dwunastu rozwiązuje przypadki, w których b mod 12 = 0. Moje rozwiązanie oblicza (ostatnia cyfra A) ^ (12+ (B mod 12)), podając liczbę z tą samą ostatnią cyfrą. (Rozważyłem podstępnie zepsute rozwiązanie eliminujące trzy znaki „12 +” za pomocą np. B mod 96, gdzie żadne przykłady nie kolidowały ...)


6

Python 125 107 znaków

Roztwór 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]

Niezły +1.
Quixotic

6

GolfScript 21

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

Zasadniczo oblicza to, A^C mod 10gdzie C jest w zakresie [1,4]i C mod 4 = B mod 4, z wyjątkiem przypadku, gdy B wynosi 0, wówczas C również wynosi 0.

Ten skrót jest możliwy, ponieważ A^(B+4) mod 10 = A^B mod 10dla dowolnej nieujemnej liczby całkowitej A i dodatniej liczby całkowitej B.


5

J, 79

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

Wow, to brzydkie! Przypomnij mi, żebym nie uczył się tego języka. +1 za znoszenie go.
Caleb

5

Ruby, 97 93 72 71 67 61 61 60

Obsługuje również przypadek, w którym b == 0.

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

Chyba gorsze jest użycie tabeli odnośników.


Daje 1 jako wynik przy podawaniu 2 5jako dane wejściowe, a nawet nie daje prawidłowego wyniku dla powyższych przypadków próbek. ideone.com/2cOPy
fR0DDY

1
@ fR0DDY: Działa idealnie w moim systemie, również w wersji 1.9.2.
Lowjacker

4

Windows PowerShell, 85

Roztwór O (1). Wzięto podpowiedź z rozwiązania Ruby Lowjackera ;-)

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

3

Python 149 znaków

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)

Ufam, że zakaz wbudowanych funkcji nie dotyczy wejść / wyjść.

import sys
p = lambda b, e: eip (b * b% 10, e / 2) * (~ e i 1 lub b)% 10 lub 1
dla lw sys.stdin: print p (* map (int, l.split ()))

Edycja: usuń użycie operatora potęgowania Pythona.

Edycja: Zastąpiono operatory trójskładnikowe zwartymi operatorami logicznymi.


Tak, możesz / musisz użyć funkcji I / O do pobierania danych wejściowych, ale nie powinieneś używać „**” do tego zadania.
Quixotic

To by działało, ale tak naprawdę nie zamierzam tego zadania dla brutalnie wymuszonego modularnego rozwiązania potęgowania, w rzeczywistości istnieje algorytm O (1) i jest też bardzo krótki :-)
Quixotic

2

Python 3k

121 znaków

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

The (a*a)%10 nie jest konieczne, ale przyspiesza, więc postanowiłem go zatrzymać.

Edycja: Najwyraźniej nawiasy nie są wymagane.

Tymczasem myślę o O(1)Rozwiązaniu. :)


Czy błąd pętli po EOF nie będzie?
Hoa Long Tam

2

JavaScript ( 117 84 79 60 znaków)

Osiągnięto 60 znaków z sugerowanymi ulepszeniami @JiminP i @NoOneIsHere. Dziękuję Ci!

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

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

Testować:

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

Wyniki:

2
3
5
9

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

1
Nie używam dużo JavaScriptu, ale czy nie mógłbyś użyć d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)lub =>w ogóle użyć ?
NoOneIsHere
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.