<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2366_-_Masterpiece_001</id>
	<title>2366 - Masterpiece 001 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2366_-_Masterpiece_001"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2366_-_Masterpiece_001&amp;action=history"/>
	<updated>2026-05-01T06:40:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2366_-_Masterpiece_001&amp;diff=2992&amp;oldid=prev</id>
		<title>Sovago Rares-Andrei: Pagină nouă: == Cerinţa == Se dă un șir de n numere naturale nenule &#039;&#039;&#039;v = {v1 , v2 , v3  ... vn }&#039;&#039;&#039;.  Se formează șirul &#039;&#039;&#039;d = {d1 , d2 , d3  ... dn }&#039;&#039;&#039; unde &#039;&#039;&#039;di&#039;&#039;&#039; = numărul divizorilor lui vi .  Notăm &#039;&#039;&#039;max&#039;&#039;&#039; = cea mai mare valoare din șirul &#039;&#039;&#039;d&#039;&#039;&#039;.  Să se afișeze în ordine crescătoare toate numerele din șirul dat &#039;&#039;&#039;v&#039;&#039;&#039; care au exact &#039;&#039;&#039;max&#039;&#039;&#039; divizori. Dacă un număr &#039;&#039;&#039;vi&#039;&#039;&#039; apare de mai multe ori în șirul &#039;&#039;&#039;v&#039;&#039;&#039; și numărul divizorilor lui &#039;&#039;&#039;vi&#039;&#039;&#039; este eg...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2366_-_Masterpiece_001&amp;diff=2992&amp;oldid=prev"/>
		<updated>2023-04-06T12:24:05Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Cerinţa == Se dă un șir de n numere naturale nenule &amp;#039;&amp;#039;&amp;#039;v = {v1 , v2 , v3  ... vn }&amp;#039;&amp;#039;&amp;#039;.  Se formează șirul &amp;#039;&amp;#039;&amp;#039;d = {d1 , d2 , d3  ... dn }&amp;#039;&amp;#039;&amp;#039; unde &amp;#039;&amp;#039;&amp;#039;di&amp;#039;&amp;#039;&amp;#039; = numărul divizorilor lui vi .  Notăm &amp;#039;&amp;#039;&amp;#039;max&amp;#039;&amp;#039;&amp;#039; = cea mai mare valoare din șirul &amp;#039;&amp;#039;&amp;#039;d&amp;#039;&amp;#039;&amp;#039;.  Să se afișeze în ordine crescătoare toate numerele din șirul dat &amp;#039;&amp;#039;&amp;#039;v&amp;#039;&amp;#039;&amp;#039; care au exact &amp;#039;&amp;#039;&amp;#039;max&amp;#039;&amp;#039;&amp;#039; divizori. Dacă un număr &amp;#039;&amp;#039;&amp;#039;vi&amp;#039;&amp;#039;&amp;#039; apare de mai multe ori în șirul &amp;#039;&amp;#039;&amp;#039;v&amp;#039;&amp;#039;&amp;#039; și numărul divizorilor lui &amp;#039;&amp;#039;&amp;#039;vi&amp;#039;&amp;#039;&amp;#039; este eg...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un șir de n numere naturale nenule &amp;#039;&amp;#039;&amp;#039;v = {v1 , v2 , v3  ... vn }&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Se formează șirul &amp;#039;&amp;#039;&amp;#039;d = {d1 , d2 , d3  ... dn }&amp;#039;&amp;#039;&amp;#039; unde &amp;#039;&amp;#039;&amp;#039;di&amp;#039;&amp;#039;&amp;#039; = numărul divizorilor lui vi .&lt;br /&gt;
&lt;br /&gt;
Notăm &amp;#039;&amp;#039;&amp;#039;max&amp;#039;&amp;#039;&amp;#039; = cea mai mare valoare din șirul &amp;#039;&amp;#039;&amp;#039;d&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Să se afișeze în ordine crescătoare toate numerele din șirul dat &amp;#039;&amp;#039;&amp;#039;v&amp;#039;&amp;#039;&amp;#039; care au exact &amp;#039;&amp;#039;&amp;#039;max&amp;#039;&amp;#039;&amp;#039; divizori. Dacă un număr &amp;#039;&amp;#039;&amp;#039;vi&amp;#039;&amp;#039;&amp;#039; apare de mai multe ori în șirul &amp;#039;&amp;#039;&amp;#039;v&amp;#039;&amp;#039;&amp;#039; și numărul divizorilor lui &amp;#039;&amp;#039;&amp;#039;vi&amp;#039;&amp;#039;&amp;#039; este egal cu &amp;#039;&amp;#039;&amp;#039;max&amp;#039;&amp;#039;&amp;#039;, atunci &amp;#039;&amp;#039;&amp;#039;vi&amp;#039;&amp;#039;&amp;#039; se va afișa o singură dată.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;masterpiece001.in&amp;#039;&amp;#039;&amp;#039; conține pe prima linie numărul &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;, iar pe a doua linie &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; numere naturale nenule separate prin spații.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,fișierul de ieșire &amp;#039;&amp;#039;&amp;#039;masterpiece001.out&amp;#039;&amp;#039;&amp;#039; va conține numerele din șirul dat &amp;#039;&amp;#039;&amp;#039;v&amp;#039;&amp;#039;&amp;#039; care au exact max divizori, în ordine crescătoare, separate prin spații. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ n ≤ m ≤ 1.000.000&lt;br /&gt;
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici sau egale cu 400.000&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &amp;#039;&amp;#039;masterpiece001.in&amp;#039;&amp;#039;&lt;br /&gt;
:10&lt;br /&gt;
:12 3 12 4 12 18 31 101 31 31&lt;br /&gt;
; &amp;#039;&amp;#039;ecran&amp;#039;&amp;#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &amp;#039;&amp;#039;masterpiece001.out&amp;#039;&amp;#039;&lt;br /&gt;
:12 18&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &amp;#039;&amp;#039;memory009.in&amp;#039;&amp;#039;&lt;br /&gt;
:5&lt;br /&gt;
:2 3 5 7 11&lt;br /&gt;
; &amp;#039;&amp;#039;ecran&amp;#039;&amp;#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &amp;#039;&amp;#039;memory009.out&amp;#039;&amp;#039;&lt;br /&gt;
:2 3 5 7 11 &lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &amp;#039;&amp;#039;memory009.in&amp;#039;&amp;#039;&lt;br /&gt;
:6&lt;br /&gt;
:2 3 5 7 11 500000&lt;br /&gt;
; &amp;#039;&amp;#039;ecran&amp;#039;&amp;#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &amp;#039;&amp;#039;memory009.out&amp;#039;&amp;#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2366 - Masterpiece 001&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def validare(n, lista):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 1000000 or any(x &amp;lt; 1 or x &amp;gt; 400000 for x in lista):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
    return True&lt;br /&gt;
def nrdiv(n):&lt;br /&gt;
    d, cnt, d2 = 2, 1, 0&lt;br /&gt;
    while n % 2 == 0:&lt;br /&gt;
        d2 += 1&lt;br /&gt;
        n //= 2&lt;br /&gt;
    cnt = d2 + 1&lt;br /&gt;
    d = 3&lt;br /&gt;
    while n &amp;gt; 1:&lt;br /&gt;
        p = 0&lt;br /&gt;
        while n % d == 0:&lt;br /&gt;
            n //= d&lt;br /&gt;
            p += 1&lt;br /&gt;
        if p &amp;gt; 0:&lt;br /&gt;
            cnt *= (p + 1)&lt;br /&gt;
        d += 2&lt;br /&gt;
        if d * d &amp;gt; n:&lt;br /&gt;
            d = n&lt;br /&gt;
    return cnt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, lista):&lt;br /&gt;
    a = [False] * 400001&lt;br /&gt;
    nrmaxdiv = 0&lt;br /&gt;
    nrmin = 400000&lt;br /&gt;
    nrmax = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        x = lista[i]&lt;br /&gt;
        if x &amp;gt; 400000:&lt;br /&gt;
            continue&lt;br /&gt;
        a[x] = True&lt;br /&gt;
        if x &amp;lt; nrmin:&lt;br /&gt;
            nrmin = x&lt;br /&gt;
        if x &amp;gt; nrmax:&lt;br /&gt;
            nrmax = x&lt;br /&gt;
    for y in range(nrmin, nrmax + 1):&lt;br /&gt;
        if a[y]:&lt;br /&gt;
            nd = nrdiv(y)&lt;br /&gt;
            if nd &amp;gt; nrmaxdiv:&lt;br /&gt;
                nrmaxdiv = nd&lt;br /&gt;
                nrmin = y&lt;br /&gt;
            elif nd == nrmaxdiv:&lt;br /&gt;
                nrmax = y&lt;br /&gt;
    result = []&lt;br /&gt;
    for i in range(nrmin, nrmax + 1):&lt;br /&gt;
        if a[i] and nrdiv(i) == nrmaxdiv:&lt;br /&gt;
            result.append(i)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    n, lista = 0, []&lt;br /&gt;
    with open(&amp;#039;masterpiece001.in&amp;#039;, &amp;#039;r&amp;#039;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        lista = [int(x) for x in fin.readline().split()]&lt;br /&gt;
    if validare(n, lista):&lt;br /&gt;
        result = rezolvare(n, lista)&lt;br /&gt;
        with open(&amp;#039;masterpiece001.out&amp;#039;, &amp;#039;w&amp;#039;) as fout:&lt;br /&gt;
            for x in result:&lt;br /&gt;
                fout.write(str(x) + &amp;#039; &amp;#039;)&lt;br /&gt;
            fout.write(&amp;#039;\n&amp;#039;)&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
validare(n, lista): Aceasta functie are rolul de a verifica daca datele de intrare respecta restrictiile impuse. Functia primeste ca parametri n, numarul de elemente din lista, si lista, o lista de numere. Daca numarul de elemente n nu se afla in intervalul [1, 1000000] sau daca exista cel putin un element din lista care nu se afla in intervalul [1, 400000], functia afiseaza mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot; si iese din program cu sys.exit(0). In caz contrar, functia returneaza valoarea True.&lt;br /&gt;
&lt;br /&gt;
nrdiv(n): Aceasta functie calculeaza numarul de divizori ai unui numar dat. Functia primeste ca parametru n, numarul pentru care se calculeaza numarul de divizori. Algoritmul folosit este bazat pe factorizarea lui n in factori primi si calcularea numarului de divizori in functie de exponentii lor. Functia returneaza numarul de divizori ai lui n.&lt;br /&gt;
&lt;br /&gt;
rezolvare(n, lista): Aceasta functie rezolva problema data, adica determina numerele din lista care au exact numarul maxim de divizori si le returneaza intr-o lista sortata in ordine crescatoare. Functia primeste ca parametri n, numarul de elemente din lista, si lista, o lista de numere. Pentru fiecare numar x din lista care se afla in intervalul [1, 400000], se calculeaza numarul de divizori nd folosind functia nrdiv(), si se retine numarul minim nrmin si numarul maxim nrmax din lista. Dupa aceea, se parcurg numerele din intervalul [nrmin, nrmax] si se calculeaza numarul de divizori pentru fiecare numar y care apare in lista. Daca numarul de divizori este mai mare decat nrmaxdiv, se actualizeaza nrmaxdiv si se retine numarul minim nrmin. Daca numarul de divizori este egal cu nrmaxdiv, se actualizeaza numarul maxim nrmax. In final, se parcurg din nou numerele din intervalul [nrmin, nrmax] si se adauga in lista result numerele care au exact numarul maxim de divizori. Functia returneaza lista result.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
</feed>