1969 - P Digit
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()