Остання цифра в експоненції


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

Я припускаю, що і А, і В є негативними?
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.
Кіхот

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

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

3

Пітон 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)

Я вважаю, що заборона проти вбудованих функцій не стосується вводу-виводу.

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

Редагувати: видалити використання оператора експоненції Python.

Редагувати: Замінено потрійні оператори короткозамкненими булевими операторами.


Так, ви можете / повинні використовувати функції вводу / виводу для отримання входів, але ви не повинні використовувати "**" для цього завдання.
Кіхотичний

Це хотілося б працювати, але я не маю на увазі цього завдання для модульного рішення модульної експоненції, насправді існує алгоритм O (1), і він дуже короткий :-)
Кіхотичний

2

Пітон 3k

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 = функція (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.