1969 - P Digit

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.

Enunt

Fie a un număr natural scris în baza 10. Notăm cu b, baza minimă în care poate fi scris a. Astfel, dacă a=21756, atunci baza minimă în care acesta poate fi scris este b=8.

Definim 'cifra de control a numărului a scris în baza b, notată cu c=digit(a)b, ca fiind numărul de o cifră obținut prin adunarea în baza b a cifrelor numărului a. Dacă rezultatul obținut este de o cifră, atunci acesta reprezintă valoarea lui c, dacă nu, se aplică repetat asupra rezultatului procedeul de însumare a cifrelor în baza b până când se obține o cifră.

De exemplu:

c=digit(21756)8=digit(2+1+7+5+6)8=25, întrucât c>8 procedeul continuă c=digit(25)8=digit(2+5)8=7.

Cerinţa

Se consideră un interval închis [x,y]. Să se determine:

  • a – primul număr prim mai mare sau egal ca x
  • b – baza minimă în care poate fi scris numărul prim a
  • c – cifra de control a numărului prim a
  • n – numărul de numere prime din intervalul [x,y] ce pot fi scrise în baza b și au cifra de control egală cu c.

Date de intrare

Fișierul de intrare pdigit.in conține pe o singură linie două valori natural x și y cu semnificația din enunț.

Date de ieșire

Fișierul de ieșire pdigit.out va conține patru valori naturale a, b, c și n, scrise fiecare pe câte o linie, valori ce reprezintă în ordine: primul număr prim strict mai mare sau egal ca x, baza minimă în care poate fi scris numărul prim a, cifra de control a numărului prim a, numărul de numere prime scrise în baza b din intervalul [x,y] care au cifra de control egală cu c.

Restricţii şi precizări

  • 1 ≤ x ≤ y ≤ 5000000
  • intervalul [x,y] conține cel puțin un număr prim
  • rezolvarea primei cerințe asigură 10% din punctaj
  • rezolvarea cerinței a doua asigură 10% din punctaj
  • rezolvarea cerinței a treia asigură 20% din punctaj
  • Rezolvarea ultimei cerințe asigură 60% din punctaj

Exemplul 1

pdigit.in
 15 75
pdigit.out
 17
 8
 1
 3 

Explicație

Primul număr prim din interval este 17. Baza minimă în care poate fi scris numărul prim este 8.

  • Cifra de contro a numărului prim este 1. Sunt 3 numere prime în intervalul dat ce pot fi scrise în baza 8, și au cifra de control egală cu 1: 17, 53, 71.



Rezolvare

def is_prime(n):
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True

def digit_sum(num, base):
    result = sum(int(digit, base=base) for digit in str(num))
    while result >= base:
        result = sum(int(digit, base=base) for digit in str(result))
    return result

def prime_in_interval(x, y):
    for num in range(x, y+1):
        if is_prime(num):
            return num
    return None

def minimum_base(prime):
    return min(prime, 8)

def control_digit(prime, base):
    return digit_sum(prime, base)

def primes_with_control_digit(x, y, base, control_digit):
    count = 0
    for num in range(x, y+1):
        if is_prime(num):
            if digit_sum(num, base) == control_digit:
                count += 1
    return count

def main():
    with open("pdigit.in", "r") as fin:
        x, y = map(int, fin.readline().split())

    prime = prime_in_interval(x, y)
    base = minimum_base(prime)
    control = control_digit(prime, base)
    count = primes_with_control_digit(x, y, base, control)

    with open("pdigit.out", "w") as fout:
        fout.write(f"{prime}\n")
        fout.write(f"{base}\n")
        fout.write(f"{control}\n")
        fout.write(f"{count}\n")

if __name__ == "__main__":
    main()