Bir üssün son basamağı


14

Bu görevde size A (10000 basamaktan az) ve B (2 ^ 64'ten az) verilecek ve (A · A · A · ... · A (B kez) son basamağını hesaplamanız gerekecektir. )).

A ve B girişleri bir boşluk ile ayrılmış tek bir satırda verilir; girişler EOF tarafından sonlandırılır.

Giriş

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Çıktı

6
3
5
9

Kısıtlamalar

  • A B'yi hesaplamak için herhangi bir dahili işlev veya aşırı yüklenmiş işleç kullanmayın (bunu gerçekten hesaplamanız gerekmez).
  • En kısa çözüm kazanır!

2
Exponentiation operatörünün A ** B dışındaki şeyleri hesaplamasına izin verilir mi?
Lowjacker

Hem A hem de B'nin negatif olmadığını sanıyorum?
aaaaaaaaaaaa

Yanıtlar:


9

J - 52 karakter

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

Sadece üçüncü girişteki sondaki boşluklar kaldırılırsa verilen tüm testleri geçer (sanırım bu kasıtsız).

Çözüm, konsol modunda j602'de çalışacaktır (örn. Terminalde, emacs j-shell, vb.). J701'de (hayır wd) çalışmaz .

Açıklama ve Matematik:

'Sihirli sayı' 12, diğer cevaplarda bulunan "son basamak" tablolarının uzunluklarının LCM'sidir. Tüm basamaklar 1, 2, 3 veya 4 ile tekrarlanır, böylece 12 ile de tekrarlanırlar. B modunun 12 = 0 olduğu durumlarda bu düzeltmeye oniki ekleme, Çözümüm hesaplanır (A'nın son basamağı) ^ (12+ (B mod 12)), aynı son basamağa sahip bir sayı vererek. (Örneklerin çarpışması muhtemel olmayan B mod 96'yı kullanarak '12 + 'üç karakterini ortadan kaldıran sinsi kırık bir çözüm olarak düşündüm ...)


6

Python 125 107 Chars

O (1) çözeltisi

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]

Güzel +1.
Mart'ta Quixotic

6

GolfScript 21

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

Bu temelde A^C mod 10C'nin aralıkta olduğu yeri hesaplar [1,4]ve C mod 4 = B mod 4B'nin 0 olması haricinde C de 0'dır.

A^(B+4) mod 10 = A^B mod 10Negatif olmayan bir tamsayı A ve pozitif bir tamsayı B için bu kısayol mümkündür .


5

J, 79

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

Vay canına bu çirkin! Bana bu dili öğrenmememi hatırlat. Buna katlanmak için +1.
Caleb

5

Yakut, 97 93 72 71 67 61 60

Ayrıca b == 0 durumunu da ele alır.

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

Bir arama tablosu kullanmak aslında daha kötü.


2 5Giriş olarak 1 çıkış verir ve yukarıdaki örnek durumlar için doğru çıkış vermez. ideone.com/2cOPy
fR0DDY

1
@ fR0DDY: 1.9.2 ile sistemimde mükemmel çalışıyor.
Lowjacker

4

Windows PowerShell, 85

O (1) çözeltisi. Lowjacker'ın Ruby çözümünden bir ipucu alındı ​​;-)

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

3

Python 149 Karakterleri

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)

Yerleşik işlevlere karşı yasağın G / Ç için geçerli olmadığına inanıyorum.

ithalat sys
p = lambda b, e: e ve p (b * b% 10, e / 2) * (~ e & 1 veya b)% 10 veya 1
sys.stdin'deki l için: baskı p (* harita (int, l.split ()))

Düzenleme: Python'un üs alma işlecinin kullanımını kaldırın.

Düzenleme: Kısa devreli boole işleçleriyle değiştirilmiş üçlü işleçler.


Evet, girişleri almak için G / Ç işlevlerini kullanabilirsiniz / kullanmalısınız, ancak bu görev için '**' kullanmanız gerekmez.
Mart'ta Quixotic

Bu işe yarayacaktı ama gerçekten kaba-zorla modüler bir üstel çözüm için bu görevi düşünmüyorum, aslında bir O (1) algoritması var ve çok da kısa :-)
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))

(a*a)%10Böylece tutmaya karar verdi, gerekli değil ama bunu hızlandırır.

Düzenleme: Görünüşe göre, parantez gerekli değildir.

Bu arada, O(1)Çözüm hakkında düşünmek . :)


EOF sonrası döngü hatası olmayacak mı?
Hoa Long Tam

2

Javascript ( 117 84 79 60 karakter)

@JiminP ve @NoOneIsHere tarafından önerilen iyileştirmelerle 60 karaktere ulaştı. Teşekkür ederim!

d = işlev (s, n) {a = Matematik.pow (s [s.length-1], n% 4 == 0? 1: n% 4) + ''; bir [a.length-1] döndür }

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

Test etmek için:

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

Sonuçlar:

2
3
5
9

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

1
JavaScript'i çok kullanmıyorum, ancak hiç kullanamadınız d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)veya kullanamadınız =>mı?
NoOneIsHere
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.