べき乗の最後の桁


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以外のものを計算するためにべき乗演算子を使用できますか?
ロージャッカー

AとBの両方が負でないと思いますか?
aaaaaaaaaaaa

回答:


9

J-52文字

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

3番目の入力の末尾のスペースが削除された場合にのみ、指定されたすべてのテストに合格します(これは意図的ではなかったと思います)。

ソリューションは、コンソールモードのj602で機能します(たとえば、ターミナル、emacs j-shellなど)。j701では機能しません(no wd)。

説明と数学:

「マジックナンバー」12は、他の回答で見つかった「最後の桁」テーブルの長さのLCMです。すべての数字は期間1、2、3、または4で繰り返されるため、期間12でも繰り返されます。12を追加すると、b mod 12 = 0の場合が修正されます。 12))、最後の数字が同じ数字を与える。(例が衝突しそうにないB mod 96などを使用して、3つの文字「12+」を削除する卑劣な壊れたソリューションを考えました...)


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

ルックアップテーブルを使用するのは実際には悪いと思います。


2 5入力として与えると出力として1を与え、上記のサンプルケースに対しては正しい出力さえも与えません。ideone.com/2cOPy
fR0DDY

1
@ fR0DDY:1.9.2でも、私のシステムで完全に動作します。
ロージャッカー

4

Windows PowerShell、85

O(1)ソリューション。LowjackerのRubyソリューションからヒントを得ました;-)

$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

Python(119 134 109)

組み込み関数の禁止はI / Oには適用されないと信じています。

インポートシステム
p = lambda b、e:eおよびp(b * b%10、e / 2)*(〜e&1or b)%10or 1
sys.stdinのlの場合:print p(* map(int、l.split()))

編集: Pythonのべき乗演算子の使用を削除します。

編集:三項演算子を短絡ブール演算子に置き換えました。


はい、入力を取得するためにI / O関数を使用する必要がありますが、このタスクに「**」を使用することは想定されていません。
キクソティック

これは、かかわらず動作しますが、私は本当に、ブルート強制べき乗剰余解決のために、このタスクを意図していない、実際にO(1)アルゴリズムがあり、それはあまりにも非常に短いです:-)
ドンキホーテ

2

Python 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文字)

@JiminPおよび@NoOneIsHereからの改善案で60文字に達しました。ありがとうございました!

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.