3025 - PCR
Cerința[edit | edit source]
Se dă n
un număr natural. Cifrele lui n
se permută pentru a forma un număr natural, de aceeași lungime cu n
, și care să fie palindrom. Aflați câte asemenea numere se pot obține.
Date de intrare[edit | edit source]
Programul citește de la tastatură numărul n
.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran numărul de palindromuri care se pot obține prin permutarea cifrelor lui n
.
Restricții și precizări[edit | edit source]
0 ≤ n ≤ 1038
- PCR este prescurtarea de la Permutări Cu Repetiţie
Exemplu:[edit | edit source]
Intrare
1102022
Ieșire
4
Explicație[edit | edit source]
Permutând cifrele lui 1102022
se pot obține următoarele palindromuri de aceeași lungime cu 1102022
: 1022201
, 1202021
, 2012102
, 2102012
.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3"> def count_palindrome_permutations(n):
total_palindromes = 0 num_even_digits = 0 num_odd_digits = 0 duplicated_digit_count = 0
while n > 0: digit = n % 10 if digit % 2 == 0: num_even_digits += 1 else: num_odd_digits += 1 n //= 10
if num_even_digits > 1 or num_odd_digits > 1: duplicated_digit_count = 1
if num_even_digits % 2 == 0: total_palindromes += (num_even_digits // 2)! * (num_odd_digits // 2)!
if num_odd_digits % 2 == 0: total_palindromes += (num_odd_digits // 2)! * (num_even_digits // 2)!
if num_odd_digits == 1 and num_even_digits > 0: total_palindromes += (num_even_digits // 2)! * duplicated_digit_count
if num_even_digits == 1 and num_odd_digits > 0: total_palindromes += (num_odd_digits // 2)! * duplicated_digit_count
return total_palindromes
def main():
n = int(input()) palindrome_count = count_palindrome_permutations(n) print(palindrome_count)
if __name__ == "__main__":
main()
</syntaxhighlight>