1969 - P Digit

From Bitnami MediaWiki

Enunt[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

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

Explicație[edit | edit source]

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[edit | edit source]

<syntaxhighlight lang="python" line> 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()

</syntaxhighlight>