Pagini recente » Cod sursa (job #3191259) | Cod sursa (job #1081184) | Cod sursa (job #1223373) | Cod sursa (job #656785) | Cod sursa (job #2372326)
/**
* Rezolvarea pleacă de la observația că ultima cifră a acestei sume se repetă
* cu o perioadă egală cu 100, adică vom avea aceeași ultimă cifră pentru N = 0,
* N = 100, N = 200, etc.
*
* Pentru a ajunge la acest rezultat, întâi observăm că ultima cifră a unei
* expresii x^y este egală cu ultima cifră a lui (x % 10)^y. Apoi, observăm că
* ultima cifră a expresiei a^y, a în {0, ..., 9}, se repetă periodic - de
* cele mai multe ori cu o perioadă de 4, adică (a^y) % 10 = (a^(y + 4)) % 10.
*
* Cu aceste informații, putem precalcula rezultatele pentru N în {0, ..., 99},
* după care trebuie doar să calculăm N % 100 pentru fiecare N citit, pentru a
* determina răspunul.
*
* Pentru a face asta, extragem numărul format din ultimele două cifre ale lui
* N (sau ultima, dacă N < 10), și afișăm rezultatul corespunzător.
*/
#include <bits/stdc++.h>
using namespace std;
const int MAX_DIGITS = 101;
const int REPEAT = 100;
int T;
int last_digits[REPEAT];
// Returnează ultima cifră a lui p^p.
int pow(int p) {
int n = p % 10 == 0 ? 0 : 1;
int exp = p % 4 == 0 ? 4 : p;
p = p % 10;
for (int i = 0; i < exp; ++i) {
n = (n * p) % 10;
}
return n;
}
// Precalculează primele 100 rezultate.
void compute_last_digits() {
for (int i = 1; i < 100; ++i) {
last_digits[i] = (last_digits[i - 1] + pow(i)) % 10;
}
}
void solve() {
char N[MAX_DIGITS];
int last_two = 0;
int N_length, last_length;
scanf("%s", N);
N_length = strlen(N);
last_length = min(2, N_length);
// Extrage numărul format din ultimele două cifre ale lui N.
for (int i = last_length; i >= 1; --i) {
last_two *= 10;
last_two += N[N_length - i] - '0';
}
// Afișează rezultatul corespunzător dintre cele precalculate.
printf("%d\n", last_digits[last_two % REPEAT]);
}
int main() {
freopen("cifra.in", "r", stdin);
freopen("cifra.out", "w", stdout);
compute_last_digits();
scanf("%d", &T);
for (int i = 0; i < T; ++i) {
solve();
}
}