Digit terakhir dalam sebuah eksponen

14

Dalam tugas ini Anda akan diberi A (kurang dari 10.000 digit) dan B (kurang dari 2 ^ 64), dan Anda harus menghitung digit terakhir dari (A · A · A · ... · A (B kali )).

Input A dan B diberikan dalam satu baris yang dipisahkan oleh blanko; input diakhiri oleh EOF.

Memasukkan

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Keluaran

6
3
5
9

Kendala

  • Jangan menggunakan fungsi inbuilt atau operator kelebihan beban untuk menghitung B (Anda benar-benar tidak perlu menghitung itu sama sekali).
  • Solusi terpendek menang!
Pemurah
sumber
2
Apakah diizinkan menggunakan operator eksponensial untuk menghitung hal selain A ** B?
Lowjacker
Saya menganggap bahwa A dan B adalah non-negatif?
aaaaaaaaaaaa

Jawaban:

9

J - 52 karakter

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

Lulus semua tes yang diberikan, meskipun hanya jika spasi tambahan pada input ketiga dihapus (saya kira ini tidak disengaja).

Solution akan bekerja di j602 dalam mode konsol (mis. Di terminal, emacs j-shell, dll.). Ini tidak akan bekerja di j701 (nowd ).

Penjelasan & Mathiness:

'Angka ajaib' 12 adalah LCM dari panjang tabel "digit terakhir" yang ditemukan dalam jawaban lain. Semua digit berulang dengan periode 1,2,3 atau 4 sehingga mereka juga akan mengulangi dengan periode 12. Menambahkan dua belas ke kasus perbaikan di mana b mod 12 = 0. Solusi saya menghitung (Digit terakhir A) ^ (12+ (mod B 12)), memberikan nomor dengan digit terakhir yang sama. (Saya menganggap solusi rusak licik menghilangkan tiga karakter '12 + 'dengan menggunakan misalnya B mod 96 di mana tidak ada contoh yang cenderung bertabrakan ...)

Jesse Millikan
sumber
6

Python 125 107 Chars

O (1) solusi

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
sumber
+1 bagus.
Quixotic
6

GolfScript 21

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

Ini pada dasarnya menghitung di A^C mod 10mana C berada dalam kisaran [1,4]danC mod 4 = B mod 4 , kecuali jika B adalah 0, maka C juga 0.

Pintasan ini dimungkinkan karena A^(B+4) mod 10 = A^B mod 10untuk bilangan bulat non-negatif A dan bilangan bulat positif B.

aaaaaaaaaaaa
sumber
5

J, 79

,._2(4 :'10|x^(+y&(|~))x{10$1 1 4 4 2')/\x:".(]_1&{.`];._2~(' ',LF)e.~])(1!:1)3
Eelvex
sumber
Wow, itu jelek! Ingatkan saya untuk tidak belajar bahasa ini. +1 untuk bertahan dengan itu.
Caleb
5

Ruby, 97 93 72 71 67 61 60

Juga menangani case di mana b == 0.

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

Kira sebenarnya lebih buruk menggunakan tabel pencarian.

Lowjacker
sumber
Ini memberikan 1 sebagai output pada pemberian 2 5sebagai input dan bahkan tidak memberikan output yang benar untuk contoh kasus di atas. ideone.com/2cOPy
fR0DDY
1
@ fR0DDY: Ini berfungsi dengan baik di sistem saya, dengan 1.9.2 juga.
Lowjacker
4

Windows PowerShell, 85

O (1) solusi. Mengambil petunjuk dari solusi Ruby Lowjacker ;-)

$input|%{$a,$b=-split$_
'0000111162481397646455556666179368421919'[4*$a[-1]%48+$b%4]}
Joey
sumber
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
sumber
3

Python ( 119 134 109)

Saya percaya larangan terhadap fungsi bawaan tidak berlaku untuk I / O.

impor sys
p = lambda b, e: e dan p (b * b% 10, e / 2) * (~ e & 1atau b)% 10atau 1
untuk l di sys.stdin: cetak p (* peta (int, l.split ()))

Sunting: hapus penggunaan operator eksponensial Python.

Sunting: Operator terner yang diganti dengan operator boolean hubung singkat.

Hoa Long Tam
sumber
Ya, Anda bisa / harus menggunakan fungsi I / O untuk mengambil input tetapi Anda tidak seharusnya menggunakan '**' untuk tugas ini.
Quixotic
Ini akan bekerja tetapi saya tidak benar-benar berniat tugas ini untuk solusi eksponensial modular brute-paksa, sebenarnya ada O (1) algoritma dan itu juga sangat pendek :-)
Quixotic
2

Python 3k

121 Karakter

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

Itu (a*a)%10 perlu tetapi mempercepat, jadi memutuskan untuk menyimpannya.

Sunting: Rupanya, tanda kurung tidak diperlukan.

Sementara itu, memikirkan O(1)Solusi. :)

st0le
sumber
Bukankah kesalahan loop setelah EOF?
Hoa Long Tam
2

Javascript ( 117 84 79 79 karakter)

Mencapai 60 karakter dengan peningkatan yang disarankan dari @JiminP dan @NoOneIsHere. Terima kasih!

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

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

Untuk mengetes:

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

Hasil:

2
3
5
9
Stephen Perelson
sumber
1
d=function(s,n){return(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)}: P
JiminP
1
Saya tidak banyak menggunakan JavaScript, tetapi tidak bisa Anda gunakan d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)atau gunakan=> sama sekali?
NoOneIsHere