3691 - crescator2
Fie un șir a
de N
numere întregi. Trebuie construit un nou șir b
(tot cu N
elemente) astfel:
- dacă , atunci
- dacă , atunci poate avea orice valoare strict pozitivă
- dacă , atunci poate avea orice valoare strict pozitivă cu excepția lui
Se garantează că și au valori strict pozitive și între oricare două valori strict pozitive se va afla cel mult una strict negativă.
Cerinta[edit | edit source]
Știindu-se șirul a
, să se calculeze numărul de moduri de a forma șirul b
astfel încât acesta să fie crescător (nu neapărat strict). Deoarece acest număr poate fi foarte mare, se va afișa doar restul împărțirii la 1.000.000 007
.
Date de intrare[edit | edit source]
Fișierul de intrare crescator.in
conține pe prima linie un număr natural N
și pe cea de-a doua N
numere întregi separate prin câte un spațiu.
Date de iesire[edit | edit source]
Fișierul de ieșire crescator.out
conține pe singura sa linie numărul cerut modulo 1.000.000 007
Restricții și precizări[edit | edit source]
1 ≤ N ≤ 300.000
- Pentru
35
de puncte,1 ≤ N ≤ 1000
și - Pentru alte
20
de puncte,
Exemplu:[edit | edit source]
crescator.in
6 1 0 3 0 -4 5
crescator.out
12
Explicație[edit | edit source]
Cele 12
șiruri crescătoare b
sunt: 1 1 3 3 3 5
, 1 1 3 3 5 5
, 1 1 3 4 5 5
, 1 1 3 5 5 5
, 1 2 3 3 3 5
, 1 2 3 3 5 5
, 1 2 3 4 5 5
, 1 2 3 5 5 5
, 1 3 3 3 3 5
, 1 3 3 3 5 5
, 1 3 3 4 5 5
, 1 3 3 5 5 5
.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3"> def sort_and_count_frequencies(numbers):
sorted_numbers = sorted(numbers)
element_counts = {}
for number in sorted_numbers: if number in element_counts: element_counts[number] += 1 else: element_counts[number] = 1
return element_counts
def main():
numbers = list(map(int, input().split()))
element_counts = sort_and_count_frequencies(numbers)
for number, count in element_counts.items(): print(f"{number}: {count}")
if __name__ == "__main__":
main()
</syntaxhighlight>