Последняя цифра в экспоненте


14

В этом задании вам дадут A (длиной менее 10000 цифр) и B (менее 2 ^ 64), и вам нужно будет вычислить последнюю цифру (A · A · A · ... ... A (B раз) )).

Входы A и B даны в одной строке, разделенной пробелом; входы заканчиваются EOF.

вход

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Выход

6
3
5
9

Ограничения

  • Не используйте никакие встроенные функции или перегруженные операторы для вычисления A B (вам вообще не нужно это вычислять).
  • Самое короткое решение побеждает!

2
Разрешено ли использовать оператор возведения в степень для вычисления других вещей, кроме A ** B?
Lowjacker

Я предполагаю, что и A, и B неотрицательны?
aaaaaaaaaaaa

Ответы:


9

J - 52 символа

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

Проходит все указанные тесты, но только если удаляются завершающие пробелы на третьем входе (я предполагаю, что это было непреднамеренно).

Решение будет работать в j602 в режиме консоли (например, в терминале, в emacs j-shell и т. Д.). Это не будет работать в j701 (нет wd).

Объяснение и математику:

«Магическое число» 12 - это LCM длин таблиц «последней цифры», найденных в других ответах. Все цифры повторяются с периодами 1, 2, 3 или 4, поэтому они также повторяются с периодом 12. Добавление двенадцати к этому исправляет случаи, когда b mod 12 = 0. Мое решение вычисляет (Последняя цифра A) ^ (12+ (B mod 12)), давая номер с той же последней цифрой. (Я рассматривал подлое сломанное решение, исключающее три символа «12 +», например, используя B mod 96, где нет примеров столкновения ...)


6

Питон 125 107 символов

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]

Ницца +1.
Quixotic

6

GolfScript 21

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

Это в основном вычисляет, A^C mod 10где C находится в диапазоне [1,4]и C mod 4 = B mod 4, кроме случаев, когда B равно 0, тогда C также равно 0.

Это сокращение возможно, потому что A^(B+4) mod 10 = A^B mod 10для любого неотрицательного целого числа A и положительного целого числа B.


5

J, 79

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

Вау, это безобразно! Напомни мне не учить этот язык. +1 за смирение с этим.
Калеб

5

Рубин, 97 93 72 71 67 61 60

Также обрабатывает случай, когда b == 0.

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

Думаю, на самом деле хуже использовать справочную таблицу.


Он дает 1 в качестве вывода при выдаче в 2 5качестве ввода и даже не дает правильного вывода для примеров выше. ideone.com/2cOPy
fR0DDY

1
@ fR0DDY: Он отлично работает на моей системе, с версией 1.9.2.
Lowjacker

4

Windows PowerShell, 85

O (1) решение. Получил подсказку от решения Ruby от Lowjacker's ;-)

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

3

Python 149 символов

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

Питон ( 119 134 109)

Я верю, что запрет на встроенные функции не распространяется на ввод-вывод.

импорт системы
p = лямбда b, e: e и p (b * b% 10, e / 2) * (~ e & 1 или b)% 10 или 1
для l в sys.stdin: выведите p (* map (int, l.split ()))

Редактировать: удалить использование оператора возведения в степень Python.

Изменить: Заменены троичные операторы с короткозамкнутыми логическими операторами.


Да, вы можете / должны использовать функции ввода / вывода для ввода данных, но вы не должны использовать «**» для этой задачи.
Quixotic

Это бы сработало, но я не собираюсь ставить эту задачу для решения методом грубого возведения в моду. На самом деле есть алгоритм O (1), и он тоже очень короткий :-)
Quixotic

2

Питон 3к

121 символ

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

В (a*a)%10этом нет необходимости, но это ускоряет его, поэтому решил оставить его.

Изменить: Видимо, скобки не обязательны.

Между тем, думая о O(1)решении. :)


Не будет ли ошибка цикла после EOF?
Хоа Лонг Там

2

Javascript ( 117 84 79 60 символов)

Достигнуто 60 символов с предложенными улучшениями от @JiminP и @NoOneIsHere. Спасибо!

d = function (s, n) {a = Math.pow (s [s.length-1], n% 4 == 0? 1: n% 4) + ''; вернуть a [a.length-1] }

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

Тестировать:

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

Результаты:

2
3
5
9

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

1
Я не часто использую JavaScript, но разве вы не можете использовать d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)или использовать =>вообще?
NoOneIsHere
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.