2250 - Fact
Enunt[edit | edit source]
Pentru un număr natural nenul, definim factorialul său ca fiind produsul tuturor numerelor naturale nenule mai mici sau egale decât el şi îl notăm N! (adică N! = 1*2*…*N). Pentru o bază de numeraţie B şi un număr natural nenul N, se cere determinarea ultimei cifre nenule a scrierii în baza B a lui N!.
Cerinţa[edit | edit source]
Se citesc 5 perechi de forma (Ni, Bi), unde 1 ≤ i ≤ 5. Pentru fiecare din cele 5 perechi citite, aflați ultima cifră nenulă a scrierii în baza Bi a factorialului numărului Ni.
Date de intrare[edit | edit source]
Fișierul de intrare fact.in conţine 5 linii, pe fiecare dintre ele fiind scrise câte două numere naturale nenule Ni şi Bi, scrise în baza 10, despărţite printr-un spaţiu.
Date de ieșire[edit | edit source]
Fișierul de ieșire fact.out va conţine 5 linii. Pe linia i se va afla cifra corespunzătoare unei perechi (Ni, Bi), citită de pe linia i din fişierul de intrare.
Restricţii şi precizări[edit | edit source]
- 1 ≤ Ni ≤ 1.000.000, pentru 1 ≤ i ≤ 5
- 2 ≤ Bi ≤ 36, pentru 1 ≤ i ≤ 5;
- în cazul în care Bi > 10, cifrele mai mari decât 9 vor fi reprezentate prin litere mari ale alfabetului englez (10='A', 11='B', …, 35='Z');
- un test va fi punctat doar dacă toate cele cinci rezultate cerute sunt corecte.
Exemplu[edit | edit source]
- fact.in
5 10 7 10 7 20 8 16 9 8
- fact.out
2 4 C 8 6
Explicație[edit | edit source]
5!=120, în baza 10, deci ultima cifră nenulă este 2 7!=5040, în baza 10, deci ultima cifră nenulă este 4 7!=CC0, în baza 20, deci ultima cifră nenulă este C 8!= 9D80, în baza 16, deci ultima cifră nenulă este 8 9!=1304600, în baza 8, deci ultima cifră nenulă este 6
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def last_nonzero_digit_factorial(N, B):
# Calculează factorialul lui N factorial = 1 for i in range(2, N + 1): factorial *= i
# Convertim factorialul în baza B factorial_base_B = "" while factorial > 0: remainder = factorial % B if remainder >= 10: factorial_base_B = chr(ord('A') + remainder - 10) + factorial_base_B else: factorial_base_B = str(remainder) + factorial_base_B factorial //= B
# Găsim ultima cifră nenulă for digit in reversed(factorial_base_B): if digit != '0': return digit
def main():
# Citim datele de intrare with open("fact.in", "r") as fin: pairs = [list(map(int, line.split())) for line in fin.readlines()]
# Determinăm ultima cifră nenulă pentru fiecare pereche results = [last_nonzero_digit_factorial(N, B) for N, B in pairs]
# Scriem rezultatele în fișierul de ieșire with open("fact.out", "w") as fout: for result in results: fout.write(str(result) + "\n")
if __name__ == "__main__":
main()
</syntaxhighlight>