1950 - PXP
Cerinţa[edit | edit source]
Se dă un şir format din N numere naturale nenule. Spunem că un număr e fericit dacă se poate scrie ca suma pătratelor a două numere naturale. Notăm cu K numărul numerelor fericite din şir şi cu P produsul acestora. Aflaţi numărul K precum şi două numere naturale care au suma pătratelor egală cu PE, unde E este un număr natural dat.
Date de intrare[edit | edit source]
Fișierul de intrare pxp.in conține pe prima linie numerele N şi E , iar pe a doua linie N numere naturale separate prin spațiu.
Date de ieșire[edit | edit source]
Fișierul de ieșire pxp.out va conține pe prima linie numărul K, reprezentând numărul numerelor fericite din şir iar pe a doua linie cele două numere care au suma pătratelor egală cu PE.
Restricţii şi precizări[edit | edit source]
- 1 ≤ N ≤ 100.000
- 1 ≤ E ≤ 3
- numerele din şir sunt mai mici decât 1.000.001 şi cel puţin un număr din şir este fericit
- 1 ≤ P ≤ 1036
- pentru a doua cerinţă se va afişa orice soluţie, fiecare test având soluţie
- pentru prima cerinţă se acordă 40p, iar pentru a doua 60p
- 0% din teste au P ≤ 1000000, iar alte 40% au P ≤ 1018
Exemplul 1[edit | edit source]
- pxp.in
5 1 11 2 13 7 5
- pxp.out
3 3 11
Explicație[edit | edit source]
Avem N=5 şi E=1. În şir sunt 3 numere fericite, 2, 13 şi 5, deoarece 2=12+12 , 13=22+32 şi 5=12+22. Produsul lor este 130=32+112, deci două numere pentru care suma pătratelor este P1 sunt 3 şi 11.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def is_happy_number(num):
i = 1 while i * i <= num: if num - i * i == int((num - i * i) ** 0.5) ** 2: return True i += 1 return False
with open("pxp.in", "r") as fin:
N, E = map(int, fin.readline().split()) numbers = list(map(int, fin.readline().split()))
happy_numbers = [] product = 1 for num in numbers:
if is_happy_number(num): happy_numbers.append(num) product *= num
K = len(happy_numbers)
target_sum = product * E found = False for i in range(len(happy_numbers)):
for j in range(i + 1, len(happy_numbers)): if happy_numbers[i] ** 2 + happy_numbers[j] ** 2 == target_sum: result = (happy_numbers[i], happy_numbers[j]) found = True break if found: break
with open("pxp.out", "w") as fout:
fout.write(str(K) + "\n") fout.write(" ".join(map(str, result)))
</syntaxhighlight>