3203 - SimonaH

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerinta

Din perfecţiunea Simonei H. a apărut şi noţiunea de p-număr, un număr natural cu cifre nenule, ale cărui cifre le putem permuta. Să se afle suma resturilor împărţirii tuturor numerelor obţinute prin permutarea cifrelor lui n la un număr dat p.

Date de intrare

Fișierul de intrare simonahin.txt conține pe prima linie numerele n şi p.

Date de iesire

Fișierul de ieșire simonahout.txt va conține pe prima linie suma resturilor împărţirii tuturor numerelor obţinute prin permutarea cifrelor lui n la numărul dat p.

Restrictii si precizari

  • 1 ⩽ n ⩽ 10^18
  • 2 ⩽ p ⩽ 5

Exemplul 1

simonahin.txt
325 5
simonahout.txt
Datele introduse corespund restrictiilor impuse
10

Exemplul 2

simonahin.txt
652 1
Datele introduse nu corespund restrictiilor impuse


Rezolvare

def este_input_valid(n, p):
    return 1 <= n <= 10**18 and 2 <= p <= 5

def putere_modulo(x, y, p):
    result = 1
    x = x % p
    
    while y > 0:
        if y % 2 == 1:
            result = (result * x) % p
        y = y // 2
        x = (x * x) % p
        
    return result

def suma_resturi_permutari(n):
    suma_totala = 0
    
    for p in [2, 3, 4, 5]:
        cifre = [int(digit) for digit in str(n)]
        factorial_inv = 1
        cifre_freq = [0] * 10
        
        for cifra in cifre:
            cifre_freq[cifra] += 1
            
        for i in range(1, 10):
            factorial_inv = (factorial_inv * putere_modulo(i, cifre_freq[i], p)) % p
        
        invers_mod_p = putere_modulo(factorial_inv, p-2, p)
        suma_totala = (suma_totala + invers_mod_p) % p
    
    return suma_totala

if __name__ == "__main__":
    # Citire date de intrare
    n, p = map(int, input("Introduceți numerele n și p, separate prin spațiu: ").split())

    # Verificare validitate date de intrare
    if not este_input_valid(n, p):
        print("Datele introduse nu corespund restricțiilor impuse.")
    else:
        # Calcul și afișare rezultat în fișierul de ieșire
        rezultat = suma_resturi_permutari(n)
        with open("simonahout.txt", "w") as f:
            f.write(str(rezultat) + "\n")

Explicatie

Numerele 325, 235, 532, 352, 253, 523 împărţite la 5 dau resturile 0,0,2,2,3,3, suma acestora fiind 10.