Chữ số cuối cùng trong số mũ


14

Trong tác vụ này, bạn sẽ được cung cấp A (dài dưới 10000 chữ số) và B (dưới 2 ^ 64) và bạn sẽ cần tính chữ số cuối cùng của (A · A · A · ... · A (B lần )).

Các đầu vào A và B được cho trong một dòng được phân tách bằng khoảng trống; các đầu vào được kết thúc bởi EOF.

Đầu vào

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Đầu ra

6
3
5
9

Những ràng buộc

  • Không sử dụng bất kỳ hàm inbuilt hoặc toán tử quá tải nào để tính A B (bạn thực sự không cần phải tính toán điều đó).
  • Giải pháp ngắn nhất sẽ thắng!

2
Có được phép sử dụng toán tử lũy thừa để tính toán những thứ khác ngoài A ** B không?
Lowjacker

Tôi cho rằng cả A và B đều không âm?
aaaaaaaaaaaa

Câu trả lời:


9

J - 52 ký tự

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

Vượt qua tất cả các bài kiểm tra được đưa ra, mặc dù chỉ khi các khoảng trắng ở đầu vào thứ ba bị xóa (tôi đoán đây là vô ý).

Giải pháp sẽ hoạt động trong j602 trong chế độ bảng điều khiển (ví dụ: trong terminal, emacs j-shell, v.v.). Nó sẽ không hoạt động trong j701 (không wd).

Giải thích & Toán học:

'Số ma thuật' 12 là LCM có độ dài của các bảng "chữ số cuối" được tìm thấy trong các câu trả lời khác. Tất cả các chữ số lặp lại với các giai đoạn 1,2,3 hoặc 4 vì vậy chúng cũng sẽ lặp lại với giai đoạn 12. Thêm mười hai vào đó sửa các trường hợp trong đó b mod 12 = 0. Giải pháp của tôi tính toán (Chữ số cuối của A) ^ (12+ (B mod 12)), đưa ra một số có cùng chữ số cuối cùng. (Tôi đã xem xét một giải pháp bị hỏng lén lút loại bỏ ba ký tự '12 + 'bằng cách sử dụng ví dụ B mod 96 trong đó không có ví dụ nào có khả năng va chạm ...)


6

Python 125 107 Chars

Giải pháp 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]

Đẹp +1.
Quixotic

6

GolfScript 21

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

Điều này về cơ bản tính toán A^C mod 10vị trí của C trong phạm vi [1,4]C mod 4 = B mod 4, ngoại trừ nếu B bằng 0, thì C cũng bằng 0.

Phím tắt này là có thể bởi vì A^(B+4) mod 10 = A^B mod 10đối với mọi số nguyên không âm A và số nguyên dương 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 thật là xấu xí! Nhắc tôi không học ngôn ngữ này. +1 để đưa lên với nó.
Caleb

5

Ruby, 97 93 72 71 67 61 60

Cũng xử lý trường hợp trong đó b == 0.

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

Đoán thực sự tồi tệ hơn khi sử dụng bảng tra cứu.


Nó cho 1 là đầu ra khi cho 2 5làm đầu vào và thậm chí không đưa ra đầu ra chính xác cho các trường hợp mẫu ở trên. ideone.com/2cOPy
fR0DDY

1
@ fR0DDY: Nó hoạt động hoàn hảo trên hệ thống của tôi, với 1.9.2 cũng vậy.
Lowjacker

4

Windows PowerShell, 85

Dung dịch O (1). Lấy một gợi ý từ giải pháp Ruby của Lowjack ;-)

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

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

3

Con trăn ( 119 134 109)

Tôi tin rằng việc cấm các chức năng tích hợp không áp dụng cho I / O.

nhập khẩu hệ thống
p = lambda b, e: e và p (b * b% 10, e / 2) * (~ e & 1or b)% 10 hoặc 1
cho l trong sys.stdin: in p (* map (int, l.split ()))

Chỉnh sửa: xóa sử dụng toán tử lũy thừa của Python.

Chỉnh sửa: Các toán tử ternary thay thế bằng các toán tử boolean ngắn mạch.


Có, bạn có thể / phải sử dụng các chức năng I / O để lấy đầu vào nhưng bạn không được phép sử dụng '**' cho nhiệm vụ này.
Quixotic

Mặc dù vậy, nó sẽ hoạt động nhưng tôi không thực sự có ý định thực hiện nhiệm vụ này cho một giải pháp lũy thừa mô đun cưỡng bức, thực sự có thuật toán O (1) và nó cũng rất ngắn :-)
Quixotic

2

Con trăn 3k

121 ký tự

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

Điều (a*a)%10này là không cần thiết nhưng nó tăng tốc nó, vì vậy quyết định giữ nó.

Chỉnh sửa: Rõ ràng, dấu ngoặc đơn là không bắt buộc.

Trong khi đó, suy nghĩ về O(1)Giải pháp. :)


Sẽ không có lỗi vòng lặp sau EOF?
Hoa Long Tâm

2

Javascript ( 117 84 79 60 ký tự)

Đạt được 60 ký tự với các cải tiến được đề xuất từ ​​@JiminP và @NoOneIsHere. Cảm ơn bạn!

d = function (s, n) {a = Math.pow (s [s.length-1], n% 4 == 0? 1: n% 4) + ''; trả về a [a.length-1] }

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

Để kiểm tra:

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

Các kết quả:

2
3
5
9

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

1
Tôi không sử dụng JavaScript nhiều, nhưng bạn hoàn toàn không thể sử dụng d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)hay sử dụng =>?
NoOneIsHere 29/2/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.