2931 - Parap
Cerința[edit | edit source]
Se dau N numere naturale a1,a2…an
. O pereche (a[j],a[k]) cu 1≤j<k≤N se numește pereche specială dacă are proprietatea că din a[j] și a[k] prin “lipire” se formează un număr X în care cifrele conținute apar de număr par de ori. De exemplu numerele 123 şi 21223 dacă se lipesc produc numărul 12321223 în care 1 apare de 2 ori, 2 apare de 4 ori și 3 apare de 2 ori.
Să se determine numărul perechilor speciale.
Date de intrare[edit | edit source]
Pe primul rând al fișierului text parap.in se află numărul natural N reprezentând numărul de elemente ale șirului dat. Pe al doilea rând, separate prin câte un spațiu se află elementele șirului dat.
Date de ieșire[edit | edit source]
Pe primul rând în fișierul de ieșire parap.out se va scrie un număr natural reprezentând numărul perechilor speciale.
Restricții și precizări[edit | edit source]
- 2 ≤ N ≤ 100.000
- 1 ≤ a[k] ≤ 1018
Exemplu:[edit | edit source]
parapin.txt
10
4 1 13 5 42 2 1 2 112 212
parapout.txt
6
Explicație[edit | edit source]
Perechile speciale sunt (1,1),(1,212),(2,2),(2,112),(1,212),(2,112).
Rezolvare[edit | edit source]
<syntaxhighlight lang="python"> def validate_input(N, values):
if not (2 <= N <= 100000): print("Eroare: N trebuie să fie între 2 și 100000.") return False
for val in values: if not (1 <= val <= 10**18): print(f"Eroare: Valoarea {val} nu este în intervalul permis.") return False
return True
def trans(x):
w = [0] * 12 sol = 0 p = 1
while x != 0: w[x % 10] += 1 x //= 10
for i in range(10): sol += p * (w[i] % 2) p *= 2 w[i] = 0
return sol
def main():
with open("parapin.txt", "r") as in_file, open("parapout.txt", "w") as out_file: n = int(in_file.readline().strip()) v = [0] * (n + 1) vf = [0] * 10002 sol = 0
numbers = map(int, in_file.readline().split())
for i in range(1, n + 1): x = next(numbers) v[i] = trans(x) sol += vf[v[i]] vf[v[i]] += 1
out_file.write(str(sol))
if __name__ == "__main__":
main()
</syntaxhighlight>