Cod sursa(job #2372326)

Utilizator alexghitaAlexandru Ghita alexghita Data 7 martie 2019 02:19:10
Problema Cifra Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
/**
 * 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();
  }
}