PROGRAM INFOARENA_CIFRA; {OK ==> 100 puncte!}
(*
Se citesc din fisier T valori pentru numarul N (1<=T<=30000).
Pentru fiecare valoare data lui N, calculati ultima cifra a sumei:
1^1 + 2^2 + 3^3 + ... + N^N,
unde: 1 <= N < 10^100 (ATENTIE! Numerele trebuie citite ca siruri!).
Timp maxim de executie pe test: 0.1 secunde;
Limita de memorie: 65536 Kbytes;
Dificultate: 1/5;
Concurs (online): Infoarena
*)
CONST UCS:ARRAY[0..19] OF 0..9 = (0,1,5,2,8,3,9,2,8,7,7,8,4,7,3,8,4,1,5,4);
{UCS[k]= UC(1^1 + 2^2 + ... + k^k), cu 0<=k<=19.}
VAR T,I,L,N2,CODERR,UC:INTEGER;
N,U2CIF_N:STRING[100];
F,G:TEXT;
BEGIN
ASSIGN(F,'cifra.in');
ASSIGN(G,'cifra.out');
RESET(F);
REWRITE(G);
READLN(F,T);
FOR I:=1 TO T DO
BEGIN
READLN(F,N);
L:=LENGTH(N);
IF (L<=2) THEN U2CIF_N:=N
ELSE U2CIF_N:=COPY(N,L-1,2);
VAL(U2CIF_N,N2,CODERR); {N2= numarul format de ultimele 2 cifre din N.}
{* Ultima cifra a termenilor sumei se repeta periodic (cu perioada
principala egala cu 20)!
** Ultima cifra a sumei dintr-o perioada (de 20 de termeni) este 4.
*** Ultima cifra a sumei a 100 de termeni consecutivi este 0.}
UC:=(4*(N2 DIV 20) + UCS[N2 MOD 20]) MOD 10;
WRITELN(G,UC);
END;
CLOSE(F);
CLOSE(G);
END.