<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Danciu</id>
	<title>Bitnami MediaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Danciu"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Danciu"/>
	<updated>2026-05-01T02:40:46Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1489_-_Bile1&amp;diff=10119</id>
		<title>1489 - Bile1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1489_-_Bile1&amp;diff=10119"/>
		<updated>2024-06-04T09:07:13Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  Algorel a primit un set de &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; bile numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; pe care trebuie să le pună în trei cutii identice astfel încât în nicio cutie să nu fie două bile numerotate cu numere consecutive.  = Cerința = În câte moduri poate face Algorel acest lucru?  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;bile1.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  = Date de ieșire = Fișierul de ieșire &amp;lt;code&amp;gt;bile1.out&amp;lt;/code&amp;gt; v...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Algorel a primit un set de &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; bile numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; pe care trebuie să le pună în trei cutii identice astfel încât în nicio cutie să nu fie două bile numerotate cu numere consecutive.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
În câte moduri poate face Algorel acest lucru?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;bile1.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;bile1.out&amp;lt;/code&amp;gt; va conține pe prima linie numărul de moduri de distribuire a bilelor.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;n ≤ 300&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;bile1.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;code&amp;gt;bile1.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 24&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1000000007  &lt;br /&gt;
&lt;br /&gt;
def count_ball_distributions(n):&lt;br /&gt;
    dp = [[0 for _ in range(4)] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        dp[i][1] = 3&lt;br /&gt;
&lt;br /&gt;
    for i in range(2, n + 1):&lt;br /&gt;
        for j in range(1, 4):&lt;br /&gt;
            dp[i][j] = 0&lt;br /&gt;
&lt;br /&gt;
            if j &amp;lt; 3:&lt;br /&gt;
                dp[i][j] += dp[i - 1][j - 1] * 3&lt;br /&gt;
                dp[i][j] += dp[i - 2][1] * 3&lt;br /&gt;
&lt;br /&gt;
            if j &amp;lt;= dp[i - 1][0]:&lt;br /&gt;
                dp[i][j] += dp[i - 1][j - 1]&lt;br /&gt;
&lt;br /&gt;
    return dp[n][1] % MOD&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;bile1.in&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        n = int(input_file.readline())&lt;br /&gt;
&lt;br /&gt;
    ball_distributions_count = count_ball_distributions(n)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;bile1.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        output_file.write(str(ball_distributions_count))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3090_-_divizori5&amp;diff=10118</id>
		<title>3090 - divizori5</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3090_-_divizori5&amp;diff=10118"/>
		<updated>2024-06-04T09:04:49Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Fie &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; trei numere naturale.  == Cerința == Să se determine numărul de numere naturale, notat cu &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, având următoarele proprietăți:  * au exact &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; divizori; * descompunerea în factori primi a acestor numere conține exact &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; numere prime; * toți factorii primi din descompunerea numerelor sunt mici sau egali cu &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;.  == Date de intrare == Fișierul de intrare &amp;lt;code&amp;gt;divizori.i...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Fie &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; trei numere naturale.&lt;br /&gt;
&lt;br /&gt;
== Cerința ==&lt;br /&gt;
Să se determine numărul de numere naturale, notat cu &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, având următoarele proprietăți:&lt;br /&gt;
&lt;br /&gt;
* au exact &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; divizori;&lt;br /&gt;
* descompunerea în factori primi a acestor numere conține exact &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; numere prime;&lt;br /&gt;
* toți factorii primi din descompunerea numerelor sunt mici sau egali cu &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;divizori.in&amp;lt;/code&amp;gt; conține pe primul rând numerele &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; cu semnificația de mai sus, despărțite prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
== Date de iesire ==&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;divizori.out&amp;lt;/code&amp;gt; va conține pe primul rând restul împărțirii numărului &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;3000017&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ D ≤ 1014&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ K ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ P ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;divizori.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;divizori.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;D = 6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K = 2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;P = 5&amp;lt;/code&amp;gt;. Sunt &amp;lt;code&amp;gt;T = 6&amp;lt;/code&amp;gt; numere cu exact &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; divizori ce conțin în descompunerea în factori primi exact două numere prime mai mici sau egale decât &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;2132&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2152&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2231&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2251&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3152&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3251&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;divizori.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 18 3 10&lt;br /&gt;
&amp;lt;code&amp;gt;divizori.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 12&lt;br /&gt;
&lt;br /&gt;
= Exemplul 3: =&lt;br /&gt;
&amp;lt;code&amp;gt;divizori.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 10 8 17&lt;br /&gt;
&amp;lt;code&amp;gt;divizori.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;D = 10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K = 8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;P = 17&amp;lt;/code&amp;gt;. Nu există numere cu exact &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; divizori ce conțin în descompunerea în factori primi exact &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; numere prime mai mici sau egale cu &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; deoarece sunt doar &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; numere prime mai mici sau egale decât &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 3000017  &lt;br /&gt;
&lt;br /&gt;
def count_numbers_with_properties(d, k, p):&lt;br /&gt;
    dp = [[0 for _ in range(k + 1)] for _ in range(d + 1)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(k + 1):&lt;br /&gt;
        for j in range(1, d + 1):&lt;br /&gt;
            if j == 1:&lt;br /&gt;
                dp[j][i] = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(2, d + 1):&lt;br /&gt;
        for j in range(1, k + 1):&lt;br /&gt;
            dp[i][j] = 0&lt;br /&gt;
&lt;br /&gt;
            for num_divisors in range(1, i):&lt;br /&gt;
                if j &amp;gt;= 2:&lt;br /&gt;
                    dp[i][j] += dp[num_divisors][j - 1] * dp[i - num_divisors][j]&lt;br /&gt;
                else:&lt;br /&gt;
                    # If j = 1, all prime factors must be distinct&lt;br /&gt;
                    if num_divisors == 1:&lt;br /&gt;
                        dp[i][j] += dp[num_divisors][j]&lt;br /&gt;
&lt;br /&gt;
    total_numbers = 0&lt;br /&gt;
    for i in range(1, d + 1):&lt;br /&gt;
        for j in range(1, k + 1):&lt;br /&gt;
            # Limit prime factors to &#039;p&#039;&lt;br /&gt;
            if max_prime_factor_up_to_p(dp[i][j], p) == dp[i][j]:&lt;br /&gt;
                total_numbers += dp[i][j]&lt;br /&gt;
&lt;br /&gt;
    return total_numbers % MOD&lt;br /&gt;
&lt;br /&gt;
def max_prime_factor_up_to_p(n, p):&lt;br /&gt;
    max_prime_factor = 1&lt;br /&gt;
    while n % 2 == 0:&lt;br /&gt;
        n //= 2&lt;br /&gt;
        max_prime_factor = 2&lt;br /&gt;
&lt;br /&gt;
    for i in range(3, int(p ** 0.5) + 1, 2):&lt;br /&gt;
        while n % i == 0:&lt;br /&gt;
            n //= i&lt;br /&gt;
            max_prime_factor = i&lt;br /&gt;
&lt;br /&gt;
    if n &amp;gt; 1:&lt;br /&gt;
        max_prime_factor = n&lt;br /&gt;
&lt;br /&gt;
    return max_prime_factor&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;divizori.in&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        d, k, p = map(int, input_file.readline().split())&lt;br /&gt;
&lt;br /&gt;
    number_count = count_numbers_with_properties(d, k, p)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;divizori.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        output_file.write(str(number_count))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2000_-_Sir9&amp;diff=10117</id>
		<title>2000 - Sir9</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2000_-_Sir9&amp;diff=10117"/>
		<updated>2024-06-04T09:01:08Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Corneluș a învățat să numere. El pornește întotdeauna de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, numără din &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, nu greșește niciodată numărul următor, însă ezită uneori și atunci spune numărul curent de mai multe ori. Sora lui, Corina, îl urmărește și face tot felul de calcule asupra modurilor în care numără fratele ei. Astfel, ea urmărește până la cât numără (&amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt;), câte numere spune în total (&amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;) și, pentru...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Corneluș a învățat să numere. El pornește întotdeauna de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, numără din &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, nu greșește niciodată numărul următor, însă ezită uneori și atunci spune numărul curent de mai multe ori. Sora lui, Corina, îl urmărește și face tot felul de calcule asupra modurilor în care numără fratele ei. Astfel, ea urmărește până la cât numără (&amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt;), câte numere spune în total (&amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;) și, pentru a aprecia cât de ezitant este, numărul maxim de repetări (&amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt;) ale unei valori. De exemplu, el poate număra până la &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; astfel: &amp;lt;code&amp;gt;1 2 3 3 4 5 6 7 7 7 7 8 8&amp;lt;/code&amp;gt;. În acest caz, numără până la &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;U=8&amp;lt;/code&amp;gt;), spune &amp;lt;code&amp;gt;13&amp;lt;/code&amp;gt; numere (&amp;lt;code&amp;gt;N=13&amp;lt;/code&amp;gt;) și ezită cel mai mult la &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;, spunându‑l de &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; ori (&amp;lt;code&amp;gt;R=4&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Cerințe =&lt;br /&gt;
1) Cunoscând numărul total de numere &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și ultimul număr spus &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt;, trebuie să calculați câte șiruri diferite au exact &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere și se termină cu numărul &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2) Cunoscând numărul total de numere &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și numărul maxim de repetări &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; ale unei valori, trebuie să calculați câte șiruri diferite au exact &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere și fiecare valoare se repetă de cel mult &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; ori.&lt;br /&gt;
&lt;br /&gt;
Deoarece numărul de șiruri poate fi foarte mare, calculați restul împărțirii acestui număr la &amp;lt;code&amp;gt;20173333&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Din fișierul &amp;lt;code&amp;gt;sir9.in&amp;lt;/code&amp;gt; se citesc trei numere naturale, &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, scrise în această ordine, cu câte un spațiu între ele. &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; poate avea una dintre valorile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, iar &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; este numărul de numere din șir. Când &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; are valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, numărul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; reprezintă ultimul număr spus (&amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt;), iar când &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; are valoarea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; reprezintă numărul maxim de repetări ale unei valori (&amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul &amp;lt;code&amp;gt;sir9.out&amp;lt;/code&amp;gt; se scrie o singură valoare, astfel:&lt;br /&gt;
&lt;br /&gt;
* dacă &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; a avut valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, valoarea reprezintă numărul de șiruri distincte care au exact &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere și se termină cu numărul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;;&lt;br /&gt;
* dacă &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; a avut valoarea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, valoarea reprezintă numărul de șiruri distincte care au exact &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere și fiecare număr se repetă de cel mult &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; ori.&lt;br /&gt;
&lt;br /&gt;
În ambele cazuri, deoarece numărul rezultat poate fi foarte mare, se va scrie restul împărțirii acestui număr la &amp;lt;code&amp;gt;20173333&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;X ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
* testele cu &amp;lt;code&amp;gt;P=1&amp;lt;/code&amp;gt; vor totaliza 50% din punctaj, restul de 50% din punctaj fiind pentru &amp;lt;code&amp;gt;P=2&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pentru teste cumulând 50 de puncte valoarea lui &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; nu depășește &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Ultima valoare spusă poate să apară de mai multe ori.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;sir9.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 5 3&lt;br /&gt;
&amp;lt;code&amp;gt;sir9.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Se rezolvă cerința 1. Pentru &amp;lt;code&amp;gt;N=5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X=3&amp;lt;/code&amp;gt;, sunt &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; șiruri care au exact &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere și se termină cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;1 1 1 2 3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 1 2 2 3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 1 2 3 3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 2 2 3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 2 3 3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 3 3 3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;sir9.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 5 2&lt;br /&gt;
&amp;lt;code&amp;gt;sir9.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Se rezolvă cerința 2. Pentru &amp;lt;code&amp;gt;N=5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X=2&amp;lt;/code&amp;gt;, sunt &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; șiruri care au exact &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere și fiecare număr se repetă de cel mult &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ori: &amp;lt;code&amp;gt;1 1 2 2 3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 1 2 3 3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 1 2 3 4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 2 3 3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 2 3 4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 3 3 4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 3 4 4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 3 4 5&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 3 =&lt;br /&gt;
&amp;lt;code&amp;gt;sir9.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 10 3&lt;br /&gt;
&amp;lt;code&amp;gt;sir9.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 274&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Se rezolvă cerința 2. Pentru &amp;lt;code&amp;gt;N=10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X=3&amp;lt;/code&amp;gt;, sunt &amp;lt;code&amp;gt;274&amp;lt;/code&amp;gt; de șiruri care au exact &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; numere și fiecare număr se repetă de cel mult &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; ori.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 20173333  &lt;br /&gt;
&lt;br /&gt;
def count_sequences_ending_with_u(n, u):&lt;br /&gt;
    dp = [[0 for _ in range(u + 1)] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(u + 1):&lt;br /&gt;
        dp[0][i] = 1 &lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(u + 1):&lt;br /&gt;
            dp[i][j] = 0&lt;br /&gt;
&lt;br /&gt;
            for k in range(1, j):&lt;br /&gt;
                if j &amp;gt;= k:&lt;br /&gt;
                    dp[i][j] += dp[i - 1][j - k]&lt;br /&gt;
                    if j &amp;gt;= 2:&lt;br /&gt;
                        dp[i][j] += dp[i - 1][j - 2]&lt;br /&gt;
&lt;br /&gt;
    return dp[n][u] % MOD&lt;br /&gt;
&lt;br /&gt;
def count_sequences_with_max_repeats_r(n, r):&lt;br /&gt;
    dp = [[0 for _ in range(r + 1)] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(r + 1):&lt;br /&gt;
        dp[0][i] = 1  &lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(r + 1):&lt;br /&gt;
            dp[i][j] = 0&lt;br /&gt;
&lt;br /&gt;
            for k in range(1, j):&lt;br /&gt;
                if j &amp;gt;= k:&lt;br /&gt;
                    dp[i][j] += dp[i - 1][j]&lt;br /&gt;
                    if j &amp;gt;= 2:&lt;br /&gt;
                        dp[i][j] += dp[i - 1][j - 1]&lt;br /&gt;
&lt;br /&gt;
    return dp[n][r] % MOD&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;sir9.in&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        p, n, x = map(int, input_file.readline().split())&lt;br /&gt;
&lt;br /&gt;
    if p == 1:&lt;br /&gt;
        sequences_count = count_sequences_ending_with_u(n, x)&lt;br /&gt;
    else:&lt;br /&gt;
        sequences_count = count_sequences_with_max_repeats_r(n, x)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;sir9.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        output_file.write(str(sequences_count))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3691_-_crescator2&amp;diff=10116</id>
		<title>3691 - crescator2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3691_-_crescator2&amp;diff=10116"/>
		<updated>2024-06-04T08:58:38Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Fie un șir &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi. Trebuie construit un nou șir &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;(tot cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; 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 == Știindu-se și...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Fie un șir &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi. Trebuie construit un nou șir &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;(tot cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; elemente) astfel:&lt;br /&gt;
&lt;br /&gt;
* dacă , atunci &lt;br /&gt;
* dacă , atunci  poate avea orice valoare strict pozitivă&lt;br /&gt;
* dacă , atunci  poate avea orice valoare strict pozitivă cu excepția lui &lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
Se garantează că  și au valori strict pozitive și între oricare două valori strict pozitive se va afla cel mult una strict negativă.&lt;br /&gt;
&lt;br /&gt;
== Cerinta ==&lt;br /&gt;
Știindu-se șirul &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, să se calculeze numărul de moduri de a forma șirul &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;1.000.000 007&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;crescator.in&amp;lt;/code&amp;gt; conține pe prima linie un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și pe cea de-a doua &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
== Date de iesire ==&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;crescator.out&amp;lt;/code&amp;gt; conține pe singura sa linie numărul cerut modulo &amp;lt;code&amp;gt;1.000.000 007&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 300.000&amp;lt;/code&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;35&amp;lt;/code&amp;gt; de puncte, &amp;lt;code&amp;gt;1 ≤ N ≤ 1000&amp;lt;/code&amp;gt; și &lt;br /&gt;
* Pentru alte &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de puncte, &lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;crescator.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 1 0 3 0 -4 5&lt;br /&gt;
&amp;lt;code&amp;gt;crescator.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 12&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Cele &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt; șiruri crescătoare &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; sunt: &amp;lt;code&amp;gt;1 1 3 3 3 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 1 3 3 5 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 1 3 4 5 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 1 3 5 5 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 3 3 3 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 3 3 5 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 3 4 5 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 2 3 5 5 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 3 3 3 3 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 3 3 3 5 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 3 3 4 5 5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 3 3 5 5 5&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def sort_and_count_frequencies(numbers):&lt;br /&gt;
    sorted_numbers = sorted(numbers)&lt;br /&gt;
&lt;br /&gt;
    element_counts = {}&lt;br /&gt;
&lt;br /&gt;
    for number in sorted_numbers:&lt;br /&gt;
        if number in element_counts:&lt;br /&gt;
            element_counts[number] += 1&lt;br /&gt;
        else:&lt;br /&gt;
            element_counts[number] = 1&lt;br /&gt;
&lt;br /&gt;
    return element_counts&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    numbers = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    element_counts = sort_and_count_frequencies(numbers)&lt;br /&gt;
&lt;br /&gt;
    for number, count in element_counts.items():&lt;br /&gt;
        print(f&amp;quot;{number}: {count}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1645_-_Fibocel&amp;diff=10115</id>
		<title>1645 - Fibocel</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1645_-_Fibocel&amp;diff=10115"/>
		<updated>2024-06-04T08:52:38Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  Toată lumea ştie că Fibocel este pasionat de numere şi că vrea să iasă în evidenţă cu orice preţ. Într-o zi, el s-a decis să numească un număr &amp;#039;&amp;#039;fibocel&amp;#039;&amp;#039; (după numele lui) dacă numărul de biţi egali cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; din reprezentarea binară a numărului este un număr Fibonacci.  Cum asta nu e de ajuns pentru el, Fibocel s-a decis să propună şi o problemă la concursul lui preferat de la Iaşi.  = Cerința = Să se raspundă la &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întreb...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Toată lumea ştie că Fibocel este pasionat de numere şi că vrea să iasă în evidenţă cu orice preţ. Într-o zi, el s-a decis să numească un număr &#039;&#039;fibocel&#039;&#039; (după numele lui) dacă numărul de biţi egali cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; din reprezentarea binară a numărului este un număr Fibonacci.&lt;br /&gt;
&lt;br /&gt;
Cum asta nu e de ajuns pentru el, Fibocel s-a decis să propună şi o problemă la concursul lui preferat de la Iaşi.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se raspundă la &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări de forma: Câte numere fibocel există în intervalul închis &amp;lt;code&amp;gt;[A, B]&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;fibocel.in&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii se găsesc câte două numere naturale &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; separate prin exact un spaţiu, reprezentând extremităţile intervalului la care se referă întrebarea.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;fibocel.out&amp;lt;/code&amp;gt; va conține exact &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; numere, câte unul pe o linie, reprezentând răspunsurile la cele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări, în ordinea în care ele apar în fişierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 50.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ A ≤ B ≤ 1015&amp;lt;/code&amp;gt;&lt;br /&gt;
* Şirul Fibonacci se defineşte astfel: , pentru &lt;br /&gt;
* Pentru 40% din teste &amp;lt;code&amp;gt;B ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;fibocel.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 15 16&lt;br /&gt;
&amp;lt;code&amp;gt;fibocel.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;15(10) =1111(2)&amp;lt;/code&amp;gt; nu este fibocel (are &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; biţi de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; iar &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; nu este număr Fibonacci)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;16(10) =10000(2)&amp;lt;/code&amp;gt; este fibocel (are &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; bit de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; iar &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; este număr Fibonacci)&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;fibocel.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 1 13&lt;br /&gt;
 13 31&lt;br /&gt;
 13 131&lt;br /&gt;
 31 131&lt;br /&gt;
 131 313&lt;br /&gt;
 313 1313&lt;br /&gt;
 1313 3131&lt;br /&gt;
&amp;lt;code&amp;gt;fibocel.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 13&lt;br /&gt;
 14&lt;br /&gt;
 76&lt;br /&gt;
 63&lt;br /&gt;
 97&lt;br /&gt;
 421&lt;br /&gt;
 667&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def is_fibocel(n):&lt;br /&gt;
    bit_count = 0&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        if n % 2 == 1:&lt;br /&gt;
            bit_count += 1&lt;br /&gt;
        n //= 2&lt;br /&gt;
&lt;br /&gt;
    previous = 0&lt;br /&gt;
    current = 1&lt;br /&gt;
    while current &amp;lt;= bit_count:&lt;br /&gt;
        if current == bit_count:&lt;br /&gt;
            return True&lt;br /&gt;
        previous, current = current, previous + current&lt;br /&gt;
&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def count_fibocel_numbers(a, b):&lt;br /&gt;
    count = 0&lt;br /&gt;
    for num in range(a, b + 1):&lt;br /&gt;
        if is_fibocel(num):&lt;br /&gt;
            count += 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;fibocel.in&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        q = int(input_file.readline())&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;fibocel.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        for _ in range(q):&lt;br /&gt;
            a, b = map(int, input_file.readline().split())&lt;br /&gt;
            fibocel_count = count_fibocel_numbers(a, b)&lt;br /&gt;
            output_file.write(str(fibocel_count) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2181_-_inversum&amp;diff=10114</id>
		<title>2181 - inversum</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2181_-_inversum&amp;diff=10114"/>
		<updated>2024-06-04T08:49:01Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Fie o permutare &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; a mulțimii &amp;lt;code&amp;gt;{1, 2, 3, ... N}&amp;lt;/code&amp;gt;. Se numește inversiune o pereche &amp;lt;code&amp;gt;(i, j), i &amp;lt; j&amp;lt;/code&amp;gt; pentru care &amp;lt;code&amp;gt;P[i] &amp;gt; P[j]&amp;lt;/code&amp;gt;. Fie funcția &amp;lt;code&amp;gt;M(N) = suma numărului de inversiuni a fiecărei permutare a numerelor {1, 2, 3, ... N}&amp;lt;/code&amp;gt;. Pentru &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; dat, să se calculeze &amp;lt;code&amp;gt;M(N)&amp;lt;/code&amp;gt; modulo &amp;lt;code&amp;gt;1000003&amp;lt;/code&amp;gt;.  = Date de intrare = Programul citește de la tastatură numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.  = Dat...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fie o permutare &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; a mulțimii &amp;lt;code&amp;gt;{1, 2, 3, ... N}&amp;lt;/code&amp;gt;. Se numește inversiune o pereche &amp;lt;code&amp;gt;(i, j), i &amp;lt; j&amp;lt;/code&amp;gt; pentru care &amp;lt;code&amp;gt;P[i] &amp;gt; P[j]&amp;lt;/code&amp;gt;. Fie funcția &amp;lt;code&amp;gt;M(N) = suma numărului de inversiuni a fiecărei permutare a numerelor {1, 2, 3, ... N}&amp;lt;/code&amp;gt;. Pentru &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; dat, să se calculeze &amp;lt;code&amp;gt;M(N)&amp;lt;/code&amp;gt; modulo &amp;lt;code&amp;gt;1000003&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, reprezentând valoarea &amp;lt;code&amp;gt;M(N)&amp;lt;/code&amp;gt; modulo &amp;lt;code&amp;gt;1000003&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 9&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1000003  &lt;br /&gt;
&lt;br /&gt;
def calculate_inversion_sum(n):&lt;br /&gt;
    total_inversions = 0&lt;br /&gt;
    factorial = 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        factorial *= i&lt;br /&gt;
&lt;br /&gt;
        current_inversions = i * (n - i)&lt;br /&gt;
&lt;br /&gt;
        total_inversions += current_inversions&lt;br /&gt;
&lt;br /&gt;
        total_inversions %= MOD&lt;br /&gt;
&lt;br /&gt;
    return total_inversions&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
&lt;br /&gt;
    inversion_sum = calculate_inversion_sum(n)&lt;br /&gt;
    print(inversion_sum)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0679_-_calatorie&amp;diff=10113</id>
		<title>0679 - calatorie</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0679_-_calatorie&amp;diff=10113"/>
		<updated>2024-06-04T08:47:23Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  Dorești să mergi în vacanță și ai hotărât deja destinația. Formal, te afli în punctul &amp;lt;code&amp;gt;(0,0)&amp;lt;/code&amp;gt; al unui sistem cartezian de axe și trebuie să ajungi în punctul de coordonate &amp;lt;code&amp;gt;(X,X)&amp;lt;/code&amp;gt;. Țara în care te afli are drumuri paralele cu axele de coordonate la fiecare abscisă și la fiecare ordonată număr natural. În fiecare moment, dacă eşti în punctul de coordonate &amp;lt;code&amp;gt;(a,b)&amp;lt;/code&amp;gt;, ai 2 variante de deplasare: în punctul &amp;lt;code&amp;gt;(a,b+1)&amp;lt;/co...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Dorești să mergi în vacanță și ai hotărât deja destinația. Formal, te afli în punctul &amp;lt;code&amp;gt;(0,0)&amp;lt;/code&amp;gt; al unui sistem cartezian de axe și trebuie să ajungi în punctul de coordonate &amp;lt;code&amp;gt;(X,X)&amp;lt;/code&amp;gt;. Țara în care te afli are drumuri paralele cu axele de coordonate la fiecare abscisă și la fiecare ordonată număr natural. În fiecare moment, dacă eşti în punctul de coordonate &amp;lt;code&amp;gt;(a,b)&amp;lt;/code&amp;gt;, ai 2 variante de deplasare: în punctul &amp;lt;code&amp;gt;(a,b+1)&amp;lt;/code&amp;gt; sau în punctul &amp;lt;code&amp;gt;(a+1,b)&amp;lt;/code&amp;gt;. La fiecare astfel de pas consumi un litru de carburant. Prin unele puncte de forma &amp;lt;code&amp;gt;(a,a)&amp;lt;/code&amp;gt; nu poți trece, iar în celelalte puncte care au abscisa egală cu ordonata poți trece și în plus, acolo se află câte o stație de benzină unde poți să „faci plinul”. Prin toate punctele care nu au abscisa egală cu ordonata poți trece dar acolo nu se află stații de benzină. Rezervorul mașinii tale are o capacitate de &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; litri.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Determinați numărul de trasee distincte prin care poți ajunge la destinație. Două trasee sunt distincte dacă diferă prin cel puţin un punct.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;calatorie.in&amp;lt;/code&amp;gt; conține pe prima linie două numere separate printr-un spațiu, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
Pe linia a &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;-a se găsește un număr &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, care reprezintă numărul de puncte de forma &amp;lt;code&amp;gt;(a,a)&amp;lt;/code&amp;gt; care nu pot fi traversate. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află câte un număr &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, cu semnificația că punctul &amp;lt;code&amp;gt;(a,a)&amp;lt;/code&amp;gt; nu poate fi vizitat.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;calatorie.out&amp;lt;/code&amp;gt; conține pe prima linie un singur număr natural reprezentând valoarea cerută, modulo &amp;lt;code&amp;gt;997&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ X ≤ 50000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ K ≤ 50&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ N ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* Călătoria începe cu rezervorul plin;&lt;br /&gt;
* Se garantează că există cel puțin un drum.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 3 10&lt;br /&gt;
 1&lt;br /&gt;
 1&lt;br /&gt;
Ieșire&lt;br /&gt;
 8&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 997  &lt;br /&gt;
&lt;br /&gt;
def count_distinct_paths(x, k, blocked_points):&lt;br /&gt;
    dp = [[0 for _ in range(x + 1)] for _ in range(x + 1)]&lt;br /&gt;
&lt;br /&gt;
    dp[0][0] = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, x + 1):&lt;br /&gt;
        for j in range(1, x + 1):&lt;br /&gt;
            if (i == j) and (j in blocked_points):&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            if j &amp;lt;= i:&lt;br /&gt;
                if dp[i - 1][j] &amp;gt; 0 and j + k &amp;gt;= i:&lt;br /&gt;
                    dp[i][j] += dp[i - 1][j]&lt;br /&gt;
&lt;br /&gt;
                if dp[i][j - 1] &amp;gt; 0:&lt;br /&gt;
                    dp[i][j] += dp[i][j - 1]&lt;br /&gt;
&lt;br /&gt;
            elif i &amp;lt;= j:&lt;br /&gt;
                if dp[i + 1][j] &amp;gt; 0 and j - k &amp;gt;= i:&lt;br /&gt;
                    dp[i][j] += dp[i + 1][j]&lt;br /&gt;
&lt;br /&gt;
                if dp[i][j + 1] &amp;gt; 0:&lt;br /&gt;
                    dp[i][j] += dp[i][j + 1]&lt;br /&gt;
&lt;br /&gt;
    return dp[x][x] % MOD&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;calatorie.in&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        x, k = map(int, input_file.readline().split())&lt;br /&gt;
        n = int(input_file.readline())&lt;br /&gt;
        blocked_points = set()&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            blocked_points.add(int(input_file.readline()))&lt;br /&gt;
&lt;br /&gt;
    distinct_paths = count_distinct_paths(x, k, blocked_points)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;calatorie.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        output_file.write(str(distinct_paths))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1236_-_Pastile&amp;diff=10112</id>
		<title>1236 - Pastile</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1236_-_Pastile&amp;diff=10112"/>
		<updated>2024-06-04T08:44:27Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  Manole este extrem de răcit. Din această cauză a mers la medicul de familie care l-a sfătuit urmeze un tratament cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; pastile, din care trebuie să ia în fiecare zi câte o jumătate. A cumpărat de la farmacie o cutie în care se aflau exact &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; pastile, fiecare dintre ele având pe suprafață o dungă care marchează jumătatea ei.  Manole începe să își ia tratamentul și constată că poate proceda doar astfel:  * scoate din cutie o pasti...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Manole este extrem de răcit. Din această cauză a mers la medicul de familie care l-a sfătuit urmeze un tratament cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; pastile, din care trebuie să ia în fiecare zi câte o jumătate. A cumpărat de la farmacie o cutie în care se aflau exact &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; pastile, fiecare dintre ele având pe suprafață o dungă care marchează jumătatea ei.&lt;br /&gt;
&lt;br /&gt;
Manole începe să își ia tratamentul și constată că poate proceda doar astfel:&lt;br /&gt;
&lt;br /&gt;
* scoate din cutie o pastilă întreagă din care folosește, în ziua respectivă, doar jumătate din ea, iar jumătatea rămasă o pune înapoi în cutie;&lt;br /&gt;
* scoate din cutie o jumătate de pastilă, rămasă din una din zilele anterioare, pe care o folosește în ziua respectivă.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care determină numărul de posibilități în care poate lua toate cele N pastile, procedând după procedeul descris mai sus.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;pastile.in&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;pastile.out&amp;lt;/code&amp;gt; va conține pe prima linie numărul determinat.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 50.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;pastile.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;code&amp;gt;pastile.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Dacă notăm cu &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; o pastilă întreagă și cu &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; o jumătate de pastilă atunci Manole avea &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; posibilități:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;P J P J P J&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;P P J J P J&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;P J P P J J&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;P P P J J J&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;P P J P J J&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def calculate_possibilities(n):&lt;br /&gt;
    dp = [0] * (n + 1)  &lt;br /&gt;
    dp[1] = 1  &lt;br /&gt;
&lt;br /&gt;
    for i in range(2, n + 1):&lt;br /&gt;
&lt;br /&gt;
        dp[i] = 2 * dp[i - 1]&lt;br /&gt;
&lt;br /&gt;
    return dp[n]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;pastile.in&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        n = int(input_file.readline())&lt;br /&gt;
&lt;br /&gt;
    possibilities = calculate_possibilities(n)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;pastile.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        output_file.write(str(possibilities))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0695_-_SumAll&amp;diff=10111</id>
		<title>0695 - SumAll</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0695_-_SumAll&amp;diff=10111"/>
		<updated>2024-06-04T08:42:34Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Fie &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; un număr natural format din cifre nenule.  Să se determine suma tuturor numerelor distincte ce se pot forma cu toate cifrele numărului &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;sumall.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.  = Date de ieșire = Fișierul de ieșire &amp;lt;code&amp;gt;sumall.out&amp;lt;/code&amp;gt; va conţine pe prima linie suma tuturor numerelor distincte ce se pot forma cu toate cifrele numărului &amp;lt;code&amp;gt;N&amp;lt;/...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fie &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; un număr natural format din cifre nenule.&lt;br /&gt;
&lt;br /&gt;
Să se determine suma tuturor numerelor distincte ce se pot forma cu toate cifrele numărului &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;sumall.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;sumall.out&amp;lt;/code&amp;gt; va conţine pe prima linie suma tuturor numerelor distincte ce se pot forma cu toate cifrele numărului &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; N &amp;lt; 1019&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;sumall.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 123&lt;br /&gt;
&amp;lt;code&amp;gt;sumall.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1332&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Toate numerele distincte ce se pot forma cu cifrele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; sunt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;132&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;213&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;231&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;321&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;123 + 132 + 213 + 231 + 312 + 321 = 1332&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;sumall.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 788&lt;br /&gt;
&amp;lt;code&amp;gt;sumall.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2553&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Toate numerele distincte ce se pot forma cu cifrele &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; sunt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;788&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;878&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;887&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;788 + 878 + 887 = 2553&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def generate_numbers(n, digits, used_digits, current_number, numbers):&lt;br /&gt;
    if len(current_number) == len(digits):&lt;br /&gt;
        numbers.append(int(current_number))&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for digit in digits:&lt;br /&gt;
        if digit not in used_digits:&lt;br /&gt;
            used_digits[digit] = True&lt;br /&gt;
&lt;br /&gt;
            current_number += digit&lt;br /&gt;
&lt;br /&gt;
            generate_numbers(n, digits, used_digits, current_number, numbers)&lt;br /&gt;
&lt;br /&gt;
            current_number = current_number[:-1]&lt;br /&gt;
&lt;br /&gt;
            used_digits[digit] = False&lt;br /&gt;
&lt;br /&gt;
def calculate_sum_of_distinct_numbers(n):&lt;br /&gt;
    digits = [int(d) for d in str(n)]  &lt;br /&gt;
&lt;br /&gt;
    numbers = []  # List to store distinct numbers&lt;br /&gt;
    used_digits = {}  # Dictionary to track used digits&lt;br /&gt;
&lt;br /&gt;
    generate_numbers(n, digits, used_digits, &amp;quot;&amp;quot;, numbers)&lt;br /&gt;
&lt;br /&gt;
    numbers.sort()&lt;br /&gt;
&lt;br /&gt;
    sum_of_distinct_numbers = 0&lt;br /&gt;
    for i in range(len(numbers)):&lt;br /&gt;
        if i == 0 or numbers[i] != numbers[i - 1]:&lt;br /&gt;
            sum_of_distinct_numbers += numbers[i]&lt;br /&gt;
&lt;br /&gt;
    return sum_of_distinct_numbers&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;sumall.in&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        n = int(input_file.readline())&lt;br /&gt;
&lt;br /&gt;
    sum_of_distinct_numbers = calculate_sum_of_distinct_numbers(n)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;sumall.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        output_file.write(str(sum_of_distinct_numbers))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3249_-_sumimp3&amp;diff=10110</id>
		<title>3249 - sumimp3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3249_-_sumimp3&amp;diff=10110"/>
		<updated>2024-06-04T08:40:15Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se citește un număr natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Calculați și afișați câte din submulțimile mulțimii &amp;lt;code&amp;gt;{1, 2, ..., n}&amp;lt;/code&amp;gt; sunt formate dintr-un număr impar de elemente. Datorită faptului că există foarte multe submulțimi, rezultatul trebuie calculat modulo &amp;lt;code&amp;gt;9001&amp;lt;/code&amp;gt;.  = Date de intrare = Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  = Date de ieșire = Programul va afișa pe ecran numărul de submulțimi formate din număr...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se citește un număr natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Calculați și afișați câte din submulțimile mulțimii &amp;lt;code&amp;gt;{1, 2, ..., n}&amp;lt;/code&amp;gt; sunt formate dintr-un număr impar de elemente. Datorită faptului că există foarte multe submulțimi, rezultatul trebuie calculat modulo &amp;lt;code&amp;gt;9001&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul de submulțimi formate din număr impar de elemente, modulo &amp;lt;code&amp;gt;9001&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤  n ≤ 2.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 4&lt;br /&gt;
Ieșire&lt;br /&gt;
 8&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Submulțimile mulțimii &amp;lt;code&amp;gt;{1, 2, ..., n}&amp;lt;/code&amp;gt; care sunt formate dintr-un număr impar de elemente sunt &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{1,2,3}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{1,2,4}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{1,3,4}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{2}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{2,3,4}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{3}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{4}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 9001  &lt;br /&gt;
&lt;br /&gt;
def count_odd_subsets(n):&lt;br /&gt;
    dp = [[0 for _ in range(n + 1)] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
    dp[0][0] = 1 &lt;br /&gt;
    dp[i][0] = 0 &lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(i + 1):&lt;br /&gt;
            if j == 0:&lt;br /&gt;
                dp[i][j] = dp[i - 1][j]&lt;br /&gt;
            else:&lt;br /&gt;
                dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j]) % MOD&lt;br /&gt;
&lt;br /&gt;
    odd_subsets = 0&lt;br /&gt;
    for j in range(n + 1):&lt;br /&gt;
        if j % 2 == 1:&lt;br /&gt;
            odd_subsets += dp[n][j]&lt;br /&gt;
&lt;br /&gt;
    return odd_subsets % MOD&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    odd_subsets_count = count_odd_subsets(n)&lt;br /&gt;
    print(odd_subsets_count)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3248_-_subimp2&amp;diff=10109</id>
		<title>3248 - subimp2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3248_-_subimp2&amp;diff=10109"/>
		<updated>2024-06-04T08:38:24Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se citește un număr natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Calculați și afișați câte din submulțimile mulțimii &amp;lt;code&amp;gt;{1, 2, ..., n}&amp;lt;/code&amp;gt; sunt formate dintr-un număr impar de elemente.  = Date de intrare = Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  = Date de ieșire = Programul va afișa pe ecran numărul de submulțimi formate din număr impar de elemente.  = Restricții și precizări =  * &amp;lt;code&amp;gt;1 ≤  n ≤ 60&amp;lt;/code&amp;gt;  = Exemplu: = Intrare  4 Ie...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se citește un număr natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Calculați și afișați câte din submulțimile mulțimii &amp;lt;code&amp;gt;{1, 2, ..., n}&amp;lt;/code&amp;gt; sunt formate dintr-un număr impar de elemente.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul de submulțimi formate din număr impar de elemente.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤  n ≤ 60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 4&lt;br /&gt;
Ieșire&lt;br /&gt;
 8&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Submulțimile mulțimii &amp;lt;code&amp;gt;{1, 2, ..., n}&amp;lt;/code&amp;gt; care sunt formate dintr-un număr impar de elemente sunt &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{1,2,3}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{1,2,4}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{1,3,4}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{2}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{2,3,4}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{3}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{4}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def count_odd_subsets(n):&lt;br /&gt;
    dp = [[0 for _ in range(n + 1)] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        dp[i][0] = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(i + 1):         &lt;br /&gt;
            if j == 0:&lt;br /&gt;
                dp[i][j] = dp[i - 1][j]  &lt;br /&gt;
&lt;br /&gt;
            else:&lt;br /&gt;
                dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]  &lt;br /&gt;
&lt;br /&gt;
    odd_subsets = 0&lt;br /&gt;
    for j in range(n + 1):&lt;br /&gt;
        if j % 2 == 1:&lt;br /&gt;
            odd_subsets += dp[n][j]&lt;br /&gt;
&lt;br /&gt;
    return odd_subsets&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
&lt;br /&gt;
    odd_subsets_count = count_odd_subsets(n)&lt;br /&gt;
    print(odd_subsets_count)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1012_-_aranjare&amp;diff=10108</id>
		<title>1012 - aranjare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1012_-_aranjare&amp;diff=10108"/>
		<updated>2024-06-04T08:36:13Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Dorel tocmai a învățat la școală despre permutări. El a reținut faptul că &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; persoane pot fi aranjate pe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; locuri în &amp;lt;code&amp;gt;n!&amp;lt;/code&amp;gt; moduri, unde . Pentru a vă pune pe voi la încercare Dorel mai alege un număr &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și vă întreabă în câte moduri putem aranja &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; persoane numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; pe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; locuri, numerotate şi ele de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/cod...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dorel tocmai a învățat la școală despre permutări. El a reținut faptul că &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; persoane pot fi aranjate pe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; locuri în &amp;lt;code&amp;gt;n!&amp;lt;/code&amp;gt; moduri, unde . Pentru a vă pune pe voi la încercare Dorel mai alege un număr &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și vă întreabă în câte moduri putem aranja &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; persoane numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; pe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; locuri, numerotate şi ele de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, astfel încât suma dintre numărul persoanei și numărul locului să fie divizibilă cu &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de moduri cerut. Deoarece acest număr ar putea fi foarte mare, rezultatul se va afișa modulo &amp;lt;code&amp;gt;100019&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p ≤ n ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* locurile și persoanele sunt numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 8 4&lt;br /&gt;
Ieșire&lt;br /&gt;
 16&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Avem &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; persoane și &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; locuri. Persoanele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; se pot așeza pe locurile &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;2!&amp;lt;/code&amp;gt; moduri, persoanele &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; pe locurile &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;2!&amp;lt;/code&amp;gt; moduri, persoanele &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; pe locurile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;2!&amp;lt;/code&amp;gt; moduri, iar persoanele &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; pe locurile &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;2!&amp;lt;/code&amp;gt; moduri. În total vom avea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;4 =16&amp;lt;/code&amp;gt; moduri de aranjare.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 100019  &lt;br /&gt;
&lt;br /&gt;
def count_valid_arrangements(n, p):&lt;br /&gt;
    total_arrangements = 0&lt;br /&gt;
    dp = [[0 for _ in range(n + 1)] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
    dp[1][1] = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(2, n + 1):&lt;br /&gt;
        for j in range(1, n + 1):&lt;br /&gt;
            current_arrangements = 0&lt;br /&gt;
&lt;br /&gt;
            if (i + j) % p == 0:&lt;br /&gt;
                current_arrangements += dp[i - 1][j]&lt;br /&gt;
&lt;br /&gt;
                if i != j:&lt;br /&gt;
                    current_arrangements += dp[i][j - 1]&lt;br /&gt;
&lt;br /&gt;
            dp[i][j] = current_arrangements&lt;br /&gt;
&lt;br /&gt;
    for j in range(1, n + 1):&lt;br /&gt;
        total_arrangements += dp[n][j]&lt;br /&gt;
&lt;br /&gt;
    return total_arrangements % MOD&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, p = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    valid_arrangements = count_valid_arrangements(n, p)&lt;br /&gt;
    print(valid_arrangements)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1011_-_p3factoriale&amp;diff=10107</id>
		<title>1011 - p3factoriale</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1011_-_p3factoriale&amp;diff=10107"/>
		<updated>2024-06-04T08:34:09Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se dau &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; numere naturale, astfel încât &amp;lt;code&amp;gt;a ≥ b + c&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; număr prim. Să se afle dacă numărul  este divizibil cu &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, și să se afle exponentul lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; în descompunerea în factori primi a acestui număr.  = Date de intrare = Programul citește de la tastatură numerele &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, separate...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dau &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; numere naturale, astfel încât &amp;lt;code&amp;gt;a ≥ b + c&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; număr prim. Să se afle dacă numărul  este divizibil cu &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, și să se afle exponentul lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; în descompunerea în factori primi a acestui număr.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, reprezentând exponentul lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; în descompunerea în factori primi a numărului natural . Dacă numărul nu este divizibil cu &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, atunci se va afișa &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a , b , c ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;a ≥ b + c&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ p ≤ 1.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 12 4 5 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Știm de la matematică faptul că numărul  este natural, deci putem vorbi despre divizibilitatea lui prin &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; ( Numărul  reprezintă combinări de  elemente luate câte  ).&lt;br /&gt;
&lt;br /&gt;
De asemenea se știe că exponentul numărului prim &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; în descompunerea în factori primi a numărului &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;! este , unde prin  am notat partea întreagă a lui .&lt;br /&gt;
&lt;br /&gt;
În exemplul dat avem , deci exponentul este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def count_p_in_factorial(n, p):&lt;br /&gt;
    exponent = 0&lt;br /&gt;
    while n % p == 0:&lt;br /&gt;
        n //= p&lt;br /&gt;
        exponent += 1&lt;br /&gt;
    return exponent&lt;br /&gt;
&lt;br /&gt;
def is_divisible_by_p(a, b, c, p):&lt;br /&gt;
    exponent_a = count_p_in_factorial(a, p)&lt;br /&gt;
    exponent_b = count_p_in_factorial(b, p)&lt;br /&gt;
    exponent_c = count_p_in_factorial(c, p)&lt;br /&gt;
&lt;br /&gt;
    if exponent_a - exponent_b - exponent_c &amp;lt; 0:&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
    exponent = exponent_a - exponent_b - exponent_c&lt;br /&gt;
    return exponent&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    a, b, c, p = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    if a &amp;gt;= b + c:&lt;br /&gt;
        exponent = is_divisible_by_p(a, b, c, p)&lt;br /&gt;
        print(exponent)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3025_-_PCR&amp;diff=10106</id>
		<title>3025 - PCR</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3025_-_PCR&amp;diff=10106"/>
		<updated>2024-06-04T08:32:34Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se dă &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; un număr natural. Cifrele lui &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se permută pentru a forma un număr natural, de aceeași lungime cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, și care să fie palindrom. Aflați câte asemenea numere se pot obține.  = Date de intrare = Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  = Date de ieșire = Programul va afișa pe ecran numărul de palindromuri care se pot obține prin permutarea cifrelor lui &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  = Restricții ș...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; un număr natural. Cifrele lui &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se permută pentru a forma un număr natural, de aceeași lungime cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, și care să fie palindrom. Aflați câte asemenea numere se pot obține.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul de palindromuri care se pot obține prin permutarea cifrelor lui &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ n ≤ 1038&amp;lt;/code&amp;gt;&lt;br /&gt;
* PCR este prescurtarea de la [[Index.php/Clasele 9-10 lecția 25 - 1 apr 2015|Permutări Cu Repetiţie]]&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 1102022&lt;br /&gt;
Ieșire&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Permutând cifrele lui &amp;lt;code&amp;gt;1102022&amp;lt;/code&amp;gt; se pot obține următoarele palindromuri de aceeași lungime cu &amp;lt;code&amp;gt;1102022&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;1022201&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1202021&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2012102&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2102012&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def count_palindrome_permutations(n):&lt;br /&gt;
    total_palindromes = 0&lt;br /&gt;
    num_even_digits = 0&lt;br /&gt;
    num_odd_digits = 0&lt;br /&gt;
    duplicated_digit_count = 0&lt;br /&gt;
&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        digit = n % 10&lt;br /&gt;
        if digit % 2 == 0:&lt;br /&gt;
            num_even_digits += 1&lt;br /&gt;
        else:&lt;br /&gt;
            num_odd_digits += 1&lt;br /&gt;
        n //= 10&lt;br /&gt;
&lt;br /&gt;
    if num_even_digits &amp;gt; 1 or num_odd_digits &amp;gt; 1:&lt;br /&gt;
        duplicated_digit_count = 1&lt;br /&gt;
&lt;br /&gt;
    if num_even_digits % 2 == 0:&lt;br /&gt;
        total_palindromes += (num_even_digits // 2)! * (num_odd_digits // 2)!&lt;br /&gt;
&lt;br /&gt;
    if num_odd_digits % 2 == 0:&lt;br /&gt;
        total_palindromes += (num_odd_digits // 2)! * (num_even_digits // 2)!&lt;br /&gt;
&lt;br /&gt;
    if num_odd_digits == 1 and num_even_digits &amp;gt; 0:&lt;br /&gt;
        total_palindromes += (num_even_digits // 2)! * duplicated_digit_count&lt;br /&gt;
&lt;br /&gt;
    if num_even_digits == 1 and num_odd_digits &amp;gt; 0:&lt;br /&gt;
        total_palindromes += (num_odd_digits // 2)! * duplicated_digit_count&lt;br /&gt;
&lt;br /&gt;
    return total_palindromes&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    palindrome_count = count_palindrome_permutations(n)&lt;br /&gt;
    print(palindrome_count)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3876_-_sum_max_min&amp;diff=10105</id>
		<title>3876 - sum max min</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3876_-_sum_max_min&amp;diff=10105"/>
		<updated>2024-06-04T08:30:38Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se dă un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi. Pentru fiecare subșir nevid al șirului dat se consideră valoarea întreagă &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; egală cu diferența dintre elementul maxim și cel minim aflat în subșir. Să se afle suma valorilor &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; ale tuturor subșirurilor nevide, mai mici sau egale decât un număr întreg &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; dat modulo .  = Date de intrare = Programul citește de la tastatură numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;T&amp;lt;/cod...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi. Pentru fiecare subșir nevid al șirului dat se consideră valoarea întreagă &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; egală cu diferența dintre elementul maxim și cel minim aflat în subșir. Să se afle suma valorilor &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; ale tuturor subșirurilor nevide, mai mici sau egale decât un număr întreg &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; dat modulo .&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran valoarea cerută în enunț.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N, T ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere citite vor fi din intervalul &amp;lt;code&amp;gt;[0, 1.000.000]&amp;lt;/code&amp;gt;&lt;br /&gt;
* se numește subșir al unui șir o succesiune de elemente(nu neapărat consecutive în acesta) ale acestuia, considerate în ordinea în care apar în șir&lt;br /&gt;
* pentru teste în valoare de &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de puncte &amp;lt;code&amp;gt;N ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5 2&lt;br /&gt;
 1 7 2 3 4&lt;br /&gt;
Ieșire&lt;br /&gt;
 11&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Dacă considerăm șirul indexat de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, un exemplu de subșir ce respectă condiția din enunț este cel format din elementele de pe pozițiile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; fiind egal în acest caz cu &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, deci egal cu &amp;lt;code&amp;gt;T = 2&amp;lt;/code&amp;gt;. Un alt subșir bun este cel format de elementele de pe pozițiile &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; fiind egal în acest caz cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, deci mai mic decât &amp;lt;code&amp;gt;T = 2&amp;lt;/code&amp;gt;. Subșirul format de elementele de pe pozițiile &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; nu respectă condiția din enunț pentru că în cazul acestuia &amp;lt;code&amp;gt;D = 5 &amp;gt; T = 2&amp;lt;/code&amp;gt;. Analizând toate subșirurile se obține în final suma &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1000000007 &lt;br /&gt;
&lt;br /&gt;
def calculate_subarray_sums(n, t, numbers):&lt;br /&gt;
    total_sum = 0  # Initialize total sum&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        max_so_far = numbers[i]&lt;br /&gt;
        min_so_far = numbers[i]&lt;br /&gt;
        subarray_count = 1&lt;br /&gt;
&lt;br /&gt;
        for j in range(i + 1, n):&lt;br /&gt;
            max_so_far = max(max_so_far, numbers[j])&lt;br /&gt;
            min_so_far = min(min_so_far, numbers[j])&lt;br /&gt;
&lt;br /&gt;
            difference = max_so_far - min_so_far&lt;br /&gt;
&lt;br /&gt;
            if difference &amp;lt;= t:&lt;br /&gt;
                contribution = (subarray_count * difference) % MOD&lt;br /&gt;
&lt;br /&gt;
                total_sum = (total_sum + contribution) % MOD&lt;br /&gt;
&lt;br /&gt;
                subarray_count += 1&lt;br /&gt;
&lt;br /&gt;
    return total_sum&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, t = map(int, input().split())&lt;br /&gt;
    numbers = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    subarray_sum = calculate_subarray_sums(n, t, numbers)&lt;br /&gt;
    print(subarray_sum)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0722_-_Cifru&amp;diff=10104</id>
		<title>0722 - Cifru</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0722_-_Cifru&amp;diff=10104"/>
		<updated>2024-06-04T08:28:07Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  Alibaba trebuie să descopere cifrul care deschide cufărul cu comoara cea mare. Cifrul este foarte greu de găsit. El a descoperit mai multe pietre, fiecare piatră având o altă culoare, pe fiecare piatră fiind scris un număr natural cu cel mult &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; cifre. Alibaba observă că numerele de pe fiecare piatră sunt distincte două câte două. Regula după care se formează cifrul este una foarte simplă, şi Alibaba a reuşit să o obţină destul de uşor: cif...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Alibaba trebuie să descopere cifrul care deschide cufărul cu comoara cea mare. Cifrul este foarte greu de găsit. El a descoperit mai multe pietre, fiecare piatră având o altă culoare, pe fiecare piatră fiind scris un număr natural cu cel mult &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; cifre. Alibaba observă că numerele de pe fiecare piatră sunt distincte două câte două. Regula după care se formează cifrul este una foarte simplă, şi Alibaba a reuşit să o obţină destul de uşor: cifrul este format din alăturarea într-o anumită ordine a tuturor pietrelor. Ceea ce Alibaba mai ştie este că pe poziţia &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; din cifru se găseşte cu siguranţă cifra &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care determină numărul de variante de cifruri pe care va trebui să le încerce Alibaba. Numărul fiind foarte mare se va calcula modulo &amp;lt;code&amp;gt;46337&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;cifru.out&amp;lt;/code&amp;gt; va conține pe prima linie trei numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; separate printr-un spaţiu, reprezentând numărul total de numere de pe pergament, poziţia &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; şi respectiv cifra &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; care se găseşte pe poziţia &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; în cifru. Pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii se găseşte câte unul din cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere de pe pergament.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Pe prima linie a fişierului de ieşire &amp;lt;code&amp;gt;cifru.out&amp;lt;/code&amp;gt; se va scrie un număr natural reprezentând numărul de variante modulo &amp;lt;code&amp;gt;46337&amp;lt;/code&amp;gt; de cifruri pe care va trebui să le încerce Alibaba.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; n &amp;lt; 25&amp;lt;/code&amp;gt;&lt;br /&gt;
* Numerele de pe fiecare piatră sunt strict pozitive mai mici decât &amp;lt;code&amp;gt;10000&amp;lt;/code&amp;gt; şi sunt distincte două câte două.&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ k ≤ 9&amp;lt;/code&amp;gt;&lt;br /&gt;
* Două cifruri diferă între ele prin ordinea de aşezare a pietrelor, chiar dacă numărul obţinut prin citirea numerelor de pe pietre este aceeaşi. De exemplu dacă există trei pietre având inscripţionate numerele &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; şi respectiv &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt;, ele se pot lipi astfel: &amp;lt;code&amp;gt;12-3-123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;123-12-3&amp;lt;/code&amp;gt;, cele două cifruri considerându-se diferite, cifrele având culori diferite.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 46337  &lt;br /&gt;
&lt;br /&gt;
def count_cipher_variants(n, p, k, numbers):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Calculates the number of cipher variants modulo MOD.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
    total_variants = 1  # One variant with all numbers fixed except for the given one&lt;br /&gt;
    fixed_numbers = set([k])  # Set of fixed numbers (initially only k)&lt;br /&gt;
    remaining_numbers = set(numbers) - fixed_numbers  # Set of remaining numbers&lt;br /&gt;
&lt;br /&gt;
    for i in range(p - 1, -1, -1):&lt;br /&gt;
        choices_for_position_i = len(remaining_numbers)&lt;br /&gt;
        total_variants *= choices_for_position_i&lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
        fixed_numbers.add(numbers.pop(i))  # Add the number to fixed numbers&lt;br /&gt;
        remaining_numbers.remove(numbers.pop(i))  # Remove it from remaining numbers&lt;br /&gt;
    return total_variants % MOD&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, p, k = map(int, input().split())&lt;br /&gt;
    numbers = [int(input()) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    cipher_variants = count_cipher_variants(n, p, k, numbers)&lt;br /&gt;
    print(cipher_variants)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4168_-_Secvente_6&amp;diff=10103</id>
		<title>4168 - Secvente 6</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4168_-_Secvente_6&amp;diff=10103"/>
		<updated>2024-06-04T08:23:59Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Notăm cu &amp;lt;code&amp;gt;[x, y]&amp;lt;/code&amp;gt;, o secvență de numere naturale nenule &amp;lt;code&amp;gt;x, x + 1, x + 2, ..., y&amp;lt;/code&amp;gt;, cu &amp;lt;code&amp;gt;x ≤ y&amp;lt;/code&amp;gt;.  Considerăm că secvența &amp;lt;code&amp;gt;[p, q]&amp;lt;/code&amp;gt; include secvența &amp;lt;code&amp;gt;[a, b]&amp;lt;/code&amp;gt; dacă are loc relația &amp;lt;code&amp;gt;p ≤ a ≤ b ≤ q&amp;lt;/code&amp;gt;.  Se dau &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; secvențe speciale de forma &amp;lt;code&amp;gt;[a, b]&amp;lt;/code&amp;gt; și apoi &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; secvențe de interogare &amp;lt;code&amp;gt;[L,R]&amp;lt;/code&amp;gt;. Orice secvență care include cel puțin o secvență specială va...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notăm cu &amp;lt;code&amp;gt;[x, y]&amp;lt;/code&amp;gt;, o secvență de numere naturale nenule &amp;lt;code&amp;gt;x, x + 1, x + 2, ..., y&amp;lt;/code&amp;gt;, cu &amp;lt;code&amp;gt;x ≤ y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Considerăm că secvența &amp;lt;code&amp;gt;[p, q]&amp;lt;/code&amp;gt; include secvența &amp;lt;code&amp;gt;[a, b]&amp;lt;/code&amp;gt; dacă are loc relația &amp;lt;code&amp;gt;p ≤ a ≤ b ≤ q&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se dau &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; secvențe speciale de forma &amp;lt;code&amp;gt;[a, b]&amp;lt;/code&amp;gt; și apoi &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; secvențe de interogare &amp;lt;code&amp;gt;[L,R]&amp;lt;/code&amp;gt;. Orice secvență care include cel puțin o secvență specială va fi numită secvență super-specială. Numărul de secvențe super-speciale pe care o secvență &amp;lt;code&amp;gt;[L, R]&amp;lt;/code&amp;gt; le include va fi denumit capacitatea secvenței &amp;lt;code&amp;gt;[L, R]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Pentru fiecare secvență de interogare, să se determine capacitatea sa.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;secvente.in&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul de secvențe speciale. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află câte două numere naturale nenule &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, separate printr-un spațiu, reprezentând secvențele speciale. Pe linia &amp;lt;code&amp;gt;N+2&amp;lt;/code&amp;gt; se află numărul natural &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, reprezentând numărul de secvențe de interogare, iar pe următoarele &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; linii se află câte două numere naturale nenule &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt;, separate printr-un spațiu, reprezentând secvențele de interogare.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;secvente.out&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; linii. Pe cea de a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-a linie din fișier se va scrie un singur număr natural, reprezentând capacitatea celei de a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-a secvențe de interogare, în ordinea din fișierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a ≤ b ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ T ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ L ≤ R ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;secvente.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 2 4&lt;br /&gt;
 3 3&lt;br /&gt;
 3&lt;br /&gt;
 2 4&lt;br /&gt;
 1 5&lt;br /&gt;
 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;secvente.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 9&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Secvența de interogare &amp;lt;code&amp;gt;[2,4]&amp;lt;/code&amp;gt; conține secvențele super-speciale &amp;lt;code&amp;gt;[2,3]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[2,4]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[3,3]&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;[3,4]&amp;lt;/code&amp;gt;. Se observă că &amp;lt;code&amp;gt;[2, 2]&amp;lt;/code&amp;gt; nu este o secvență super-specială deoarece nu include pe niciuna dintre cele două secvențe speciale (&amp;lt;code&amp;gt;[2, 4]&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;[3, 3]&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Secvența de interogare &amp;lt;code&amp;gt;[1,5]&amp;lt;/code&amp;gt; conține secvențele super-speciale &amp;lt;code&amp;gt;[1,3]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[1,4]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[1,5]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[2,3]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[2,4]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[2,5]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[3,3]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[3,4]&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;[3,5]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Secvența de interogare &amp;lt;code&amp;gt;[2,5]&amp;lt;/code&amp;gt; conține secvențele super-speciale &amp;lt;code&amp;gt;[2,3]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[2,4]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[2,5]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[3,3]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[3,4]&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;[3,5]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def read_special_sequences(n):&lt;br /&gt;
    special_sequences = []&lt;br /&gt;
    for _ in range(n):&lt;br /&gt;
        a, b = map(int, input().split())&lt;br /&gt;
        special_sequences.append((a, b))&lt;br /&gt;
    return special_sequences&lt;br /&gt;
&lt;br /&gt;
def read_query_sequences(t):&lt;br /&gt;
    query_sequences = []&lt;br /&gt;
    for _ in range(t):&lt;br /&gt;
        l, r = map(int, input().split())&lt;br /&gt;
        query_sequences.append((l, r))&lt;br /&gt;
    return query_sequences&lt;br /&gt;
&lt;br /&gt;
def is_super_special(query_sequence, special_sequences):&lt;br /&gt;
    for a, b in special_sequences:&lt;br /&gt;
        if a &amp;lt;= query_sequence[0] &amp;lt;= query_sequence[1] &amp;lt;= b:&lt;br /&gt;
            return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def count_super_special_sequences(query_sequence, special_sequences):&lt;br /&gt;
    count = 0&lt;br /&gt;
    for a, b in special_sequences:&lt;br /&gt;
        if a &amp;lt;= query_sequence[0] &amp;lt;= b &amp;lt;= query_sequence[1]:&lt;br /&gt;
            count += 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    special_sequences = read_special_sequences(n)&lt;br /&gt;
&lt;br /&gt;
    t = int(input())&lt;br /&gt;
    query_sequences = read_query_sequences(t)&lt;br /&gt;
&lt;br /&gt;
    for query_sequence in query_sequences:&lt;br /&gt;
        super_special_count = count_super_special_sequences(query_sequence, special_sequences)&lt;br /&gt;
        print(super_special_count)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0599_-_Covoare&amp;diff=10102</id>
		<title>0599 - Covoare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0599_-_Covoare&amp;diff=10102"/>
		<updated>2024-06-04T08:20:47Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se consideră o încăpere de lungime &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și lățime &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; împărțită în &amp;lt;code&amp;gt;n*m&amp;lt;/code&amp;gt; zone pătrate, sub forma unei matrice cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane. Încăperea este acoperită în totalitate cu &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; covoare de diferite dimensiuni și culori astfel încât acestea nu se suprapun și încăperea este acoperită în totalitate. Mai mult fiecare zonă pătrată a încăperii este acoperită cu un si...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se consideră o încăpere de lungime &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și lățime &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; împărțită în &amp;lt;code&amp;gt;n*m&amp;lt;/code&amp;gt; zone pătrate, sub forma unei matrice cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane. Încăperea este acoperită în totalitate cu &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; covoare de diferite dimensiuni și culori astfel încât acestea nu se suprapun și încăperea este acoperită în totalitate. Mai mult fiecare zonă pătrată a încăperii este acoperită cu un singur covor.&lt;br /&gt;
&lt;br /&gt;
Gigel, administratorul clădirii, este responsabil cu spălarea covoarelor. Astfel el a notat, în ordine, dimensiunile și culoarea fiecărui covor, în ordine, de sus în jos și de la stânga la dreapta. Covoarele au fost scoase și spălate, dar acum Gigel vă cere ajutorul.&lt;br /&gt;
&lt;br /&gt;
Cunoscând dimensiunile încăperii, numărul de covoare precum și dimensiunile și culoarea fiecărui covor, să se refacă așezarea inițială a acestora.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;covoare.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n m p&amp;lt;/code&amp;gt;, iar pe a următoarele &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; linii câte trei numere &amp;lt;code&amp;gt;a b c&amp;lt;/code&amp;gt; reprezentând lungimea, lățimea și culoarea fiecărui covor.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;covoare.out&amp;lt;/code&amp;gt; va conține o matrice &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane, &amp;lt;code&amp;gt;A[i][j]&amp;lt;/code&amp;gt; reprezentând culoarea covorului care acoperă zona &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;. Fiecare linie a matricei va fi scrisă pe o linie a fișierului, elementele unei linii fiind separate prin exact un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n, m ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* covoarele trebuie așezate în ordinea dată, și nu pot fi rotite&lt;br /&gt;
* culoarea unui covor este un număr natural nenul&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;covoare.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 6 8&lt;br /&gt;
 3 2 2&lt;br /&gt;
 1 1 1&lt;br /&gt;
 2 3 2&lt;br /&gt;
 1 1 4&lt;br /&gt;
 4 2 3&lt;br /&gt;
 2 2 1&lt;br /&gt;
 2 1 1&lt;br /&gt;
 2 1 3&lt;br /&gt;
&amp;lt;code&amp;gt;covoare.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2 2 1 2 2&lt;br /&gt;
 2 2 2 4 2 2&lt;br /&gt;
 3 3 3 3 2 2&lt;br /&gt;
 3 3 3 3 1 1&lt;br /&gt;
 1 1 3 3 1 1&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def read_input(n, m, p):&lt;br /&gt;
    carpets = []&lt;br /&gt;
    for _ in range(p):&lt;br /&gt;
        a, b, c = map(int, input().split())&lt;br /&gt;
        carpets.append((a, b, c))&lt;br /&gt;
    return carpets&lt;br /&gt;
&lt;br /&gt;
def is_valid_placement(carpets, n, m):&lt;br /&gt;
    used_area = [[False for _ in range(m)] for _ in range(n)]&lt;br /&gt;
    for a, b, _ in carpets:&lt;br /&gt;
        for i in range(n - a + 1):&lt;br /&gt;
            for j in range(m - b + 1):&lt;br /&gt;
                if used_area[i][j]:&lt;br /&gt;
                    return False&lt;br /&gt;
                for x in range(a):&lt;br /&gt;
                    for y in range(b):&lt;br /&gt;
                        used_area[i + x][j + y] = True&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def place_carpets(carpets, n, m):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Arranges the carpets on the floor.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    floor = [[0 for _ in range(m)] for _ in range(n)]&lt;br /&gt;
    for a, b, c in carpets:&lt;br /&gt;
        for i in range(n - a + 1):&lt;br /&gt;
            for j in range(m - b + 1):&lt;br /&gt;
                if not used_area[i][j]:&lt;br /&gt;
                    for x in range(a):&lt;br /&gt;
                        for y in range(b):&lt;br /&gt;
                            floor[i + x][j + y] = c&lt;br /&gt;
                            used_area[i + x][j + y] = True&lt;br /&gt;
                    break&lt;br /&gt;
    return floor&lt;br /&gt;
&lt;br /&gt;
def print_floor(floor, n, m):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            print(floor[i][j], end=&amp;quot; &amp;quot;)&lt;br /&gt;
        print()&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m, p = map(int, input().split())&lt;br /&gt;
    carpets = read_input(n, m, p)&lt;br /&gt;
&lt;br /&gt;
    if not is_valid_placement(carpets, n, m):&lt;br /&gt;
        print(&amp;quot;IMPOSIBIL&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    floor = place_carpets(carpets, n, m)&lt;br /&gt;
    print_floor(floor, n, m)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2235_-_tsunami&amp;diff=10101</id>
		<title>2235 - tsunami</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2235_-_tsunami&amp;diff=10101"/>
		<updated>2024-06-04T07:55:16Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  Tsunamiul este valul mareic ce se propagă prin apa oceanelor/mărilor, ca urmare a producerii unor erupţii subacvatice sau/şi a unor cutremure submarine sau de coastă foarte puternice.  Cercetătorii doresc să preîntâmpine efectele unor posibile valuri mareice prin marcarea şi clasificarea zonelor al căror risc de inundare este ridicat.  Teritoriul studiat a fost împărţit în &amp;lt;code&amp;gt;n×m&amp;lt;/code&amp;gt; pătrate identice (zone) rezultând o hartă digitizată, reprezentat...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Tsunamiul este valul mareic ce se propagă prin apa oceanelor/mărilor, ca urmare a producerii unor erupţii subacvatice sau/şi a unor cutremure submarine sau de coastă foarte puternice.&lt;br /&gt;
&lt;br /&gt;
Cercetătorii doresc să preîntâmpine efectele unor posibile valuri mareice prin marcarea şi clasificarea zonelor al căror risc de inundare este ridicat.&lt;br /&gt;
&lt;br /&gt;
Teritoriul studiat a fost împărţit în &amp;lt;code&amp;gt;n×m&amp;lt;/code&amp;gt; pătrate identice (zone) rezultând o hartă digitizată, reprezentată sub forma unui tablou bidimensional cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane, fiecare element al tabloului memorând cota (înălţimea) terenului din pătratul unitate corespunzător. Zonele de apă au cota &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, iar zonele de uscat au cote mai mari decât &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Orice tsunami este clasificat în funcţie de înălţimea valului mareic, pe o scară de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;. Cercetătorii doresc să marcheze zonele de risc ce pot fi afectate de un potenţial tsunami.&lt;br /&gt;
&lt;br /&gt;
Iniţial, valul mareic apare în toate zonele de cotă &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; vecine cu cel puţin o zonă de uscat. O zonă teritorială poate fi afectată dacă are cota strict mai mică decât înălţimea valului mareic şi se află în vecinătatea apei sau în vecinătatea unei zone afectate. Două pătrate unitate se învecinează dacă au o latură comună.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dată fiind harta digitizată a zonelor monitorizate, să se determine numărul zonelor de uscat afectate de un tsunami de înălțime &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;tsunami.in&amp;lt;/code&amp;gt; conține pe prima linie trei numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; separate prin câte un spațiu, reprezentând dimensiunile hărții, respectiv înălțimea valului mareic. Pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii sunt scrise câte &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; numere naturale separate prin câte un spațiu reprezentând, în ordine, cotele din cele &amp;lt;code&amp;gt;n×m&amp;lt;/code&amp;gt; pătrate teritoriale unitate ale hărții.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;tsunami.out&amp;lt;/code&amp;gt; conţine o singură valoare ce reprezintă numărul pătratelor unitate afectate de un tsunami de înălţime &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ n,m ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ h ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* Zona monitorizată nu conţine lacuri interioare (pătrate unitate învecinate, având cota &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, înconjurate complet de pătrate unitate având cote strict mai mari decît &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Cotele sunt numere naturale ≤ &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;tsunami.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7 3&lt;br /&gt;
 0 0 4 2 5 0 0&lt;br /&gt;
 1 0 0 7 3 6 0&lt;br /&gt;
 2 3 0 5 2 2 0&lt;br /&gt;
 0 7 5 4 0 0 0&lt;br /&gt;
 0 5 2 3 0 2 0&lt;br /&gt;
 0 4 4 8 0 2 0&lt;br /&gt;
&amp;lt;code&amp;gt;tsunami.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Zonele inundate sunt reprezentate îngroşat în tabloul bidimensional:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def is_valid_land(grid, n, m, i, j):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Checks if the given cell (i, j) is a valid land area.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if 0 &amp;lt;= i &amp;lt; n and 0 &amp;lt;= j &amp;lt; m:&lt;br /&gt;
        return grid[i][j] &amp;gt; 0&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def mark_affected_areas(grid, n, m, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Marks affected land areas starting from water cells.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    affected_count = 0&lt;br /&gt;
    stack = []&lt;br /&gt;
&lt;br /&gt;
    # Initialize stack with water cells adjacent to land&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if grid[i][j] == 0:&lt;br /&gt;
                for di, dj in [(1, 0), (0, 1), (-1, 0), (0, -1)]:&lt;br /&gt;
                    new_i = i + di&lt;br /&gt;
                    new_j = j + dj&lt;br /&gt;
                    if is_valid_land(grid, n, m, new_i, new_j):&lt;br /&gt;
                        stack.append((new_i, new_j))&lt;br /&gt;
&lt;br /&gt;
    # Mark affected land areas using DFS&lt;br /&gt;
    while stack:&lt;br /&gt;
        i, j = stack.pop()&lt;br /&gt;
        if grid[i][j] &amp;gt; 0 and grid[i][j] &amp;lt;= h:&lt;br /&gt;
            grid[i][j] = -1  # Mark as affected&lt;br /&gt;
            affected_count += 1&lt;br /&gt;
&lt;br /&gt;
            for di, dj in [(1, 0), (0, 1), (-1, 0), (0, -1)]:&lt;br /&gt;
                new_i = i + di&lt;br /&gt;
                new_j = j + dj&lt;br /&gt;
                if is_valid_land(grid, n, m, new_i, new_j) and grid[new_i][new_j] &amp;gt; 0:&lt;br /&gt;
                    stack.append((new_i, new_j))&lt;br /&gt;
&lt;br /&gt;
    return affected_count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Reads input, marks affected areas, and prints the result.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    n, m, h = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    # Read the grid data&lt;br /&gt;
    grid = []&lt;br /&gt;
    for _ in range(n):&lt;br /&gt;
        row = list(map(int, input().split()))&lt;br /&gt;
        grid.append(row)&lt;br /&gt;
&lt;br /&gt;
    # Mark affected land areas and count them&lt;br /&gt;
    affected_count = mark_affected_areas(grid, n, m, h)&lt;br /&gt;
&lt;br /&gt;
    # Print the number of affected land areas&lt;br /&gt;
    print(affected_count)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.stdin = open(&amp;quot;tsunami.in&amp;quot;)&lt;br /&gt;
    sys.stdout = open(&amp;quot;tsunami.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
    main()&lt;br /&gt;
    sys.stdin.close()&lt;br /&gt;
    sys.stdout.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3114_-_abq&amp;diff=10100</id>
		<title>3114 - abq</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3114_-_abq&amp;diff=10100"/>
		<updated>2024-06-04T07:51:46Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerință = Alexandru a învățat azi despre numerele romane și cum se scriu acestea. Fiind distras de ce spuneau colegii a ajuns acasă și a realizat că nu știe cum să transforme un număr din cifre arabe în cifre romane. Deoarece a doua zi are un test numai din acest capitol, vă roagă să îl ajutați la transformarea unui număr &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; dat, scris cu cifre arabe în cifre romane.  = Date de intrare = Fișierul &amp;lt;code&amp;gt;cifre_romane.in&amp;lt;/code&amp;gt; conține un num...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerință =&lt;br /&gt;
Alexandru a învățat azi despre numerele romane și cum se scriu acestea. Fiind distras de ce spuneau colegii a ajuns acasă și a realizat că nu știe cum să transforme un număr din cifre arabe în cifre romane. Deoarece a doua zi are un test numai din acest capitol, vă roagă să îl ajutați la transformarea unui număr &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; dat, scris cu cifre arabe în cifre romane.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;cifre_romane.in&amp;lt;/code&amp;gt; conține un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; scris cu cifre arabe.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;cifre_romane.out&amp;lt;/code&amp;gt; va conține scrierea cu cifre romane a lui &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1≤N≤3999&amp;lt;/code&amp;gt;&lt;br /&gt;
* cifrele romane sunt:&lt;br /&gt;
** &amp;lt;code&amp;gt;I=1&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;V=5&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;X=10&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;L=50&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;C=100&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;D=500&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;M=1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu =&lt;br /&gt;
&amp;lt;code&amp;gt;cifre_romane.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;code&amp;gt;cifre_romane.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 IV&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def convert_to_roman(num):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Converts a given number from Arabic numerals to Roman numerals.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    roman_numerals = {&lt;br /&gt;
        1: &amp;quot;I&amp;quot;,&lt;br /&gt;
        5: &amp;quot;V&amp;quot;,&lt;br /&gt;
        10: &amp;quot;X&amp;quot;,&lt;br /&gt;
        50: &amp;quot;L&amp;quot;,&lt;br /&gt;
        100: &amp;quot;C&amp;quot;,&lt;br /&gt;
        500: &amp;quot;D&amp;quot;,&lt;br /&gt;
        1000: &amp;quot;M&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    result = &amp;quot;&amp;quot;&lt;br /&gt;
    while num &amp;gt; 0:&lt;br /&gt;
        # Find the largest Roman numeral that is less than or equal to the current number&lt;br /&gt;
        for key in sorted(roman_numerals.keys(), reverse=True):&lt;br /&gt;
            if num &amp;gt;= key:&lt;br /&gt;
                result += roman_numerals[key]&lt;br /&gt;
                num -= key&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Reads input and converts numbers to Roman numerals.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    num = int(input())&lt;br /&gt;
&lt;br /&gt;
    # Check if the number is within the valid range&lt;br /&gt;
    if 1 &amp;lt;= num &amp;lt;= 3999:&lt;br /&gt;
        roman_numeral = convert_to_roman(num)&lt;br /&gt;
        print(roman_numeral)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Numarul nu este in intervalul valid (1 ≤ N ≤ 3999).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.stdin = open(&amp;quot;cifre_romane.in&amp;quot;)&lt;br /&gt;
    sys.stdout = open(&amp;quot;cifre_romane.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
    main()&lt;br /&gt;
    sys.stdin.close()&lt;br /&gt;
    sys.stdout.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1870_-_Easy_xy&amp;diff=10099</id>
		<title>1870 - Easy xy</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1870_-_Easy_xy&amp;diff=10099"/>
		<updated>2024-06-04T07:47:22Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se dă un vector &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; elemente numere naturale numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; întrebări de forma:  * &amp;lt;code&amp;gt;x y p&amp;lt;/code&amp;gt;: se afișează valoarea ce s-ar afla pe poziția &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; dacă &amp;lt;code&amp;gt;v[x...y]&amp;lt;/code&amp;gt; ar fi ordonat crescător.  Să se răspundă la cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; întrebări.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;easyxy.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;N...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă un vector &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; elemente numere naturale numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; întrebări de forma:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;x y p&amp;lt;/code&amp;gt;: se afișează valoarea ce s-ar afla pe poziția &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; dacă &amp;lt;code&amp;gt;v[x...y]&amp;lt;/code&amp;gt; ar fi ordonat crescător.&lt;br /&gt;
&lt;br /&gt;
Să se răspundă la cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; întrebări.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;easyxy.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. Pe următoarea linie se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; elemente ce reprezintă elementele vectorului. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află întrebările.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;easyxy.out&amp;lt;/code&amp;gt; va conține pe fiecare linie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; răspunsul la întrebarea &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, în ordinea în care acestea apar în fișierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N,M ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Elementele vectorului sunt &amp;lt;code&amp;gt;≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru orice întrebare, &amp;lt;code&amp;gt;1 ≤ x ≤ p ≤ y ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;easyxy.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 3&lt;br /&gt;
 1 3 2 5 6 3&lt;br /&gt;
 1 3 2&lt;br /&gt;
 1 6 5&lt;br /&gt;
 3 5 4&lt;br /&gt;
&amp;lt;code&amp;gt;easyxy.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 5&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
import bisect&lt;br /&gt;
&lt;br /&gt;
def solve_test_case(n, m, arr):&lt;br /&gt;
    prefix_sums = [0] * (n + 1)&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        prefix_sums[i] = prefix_sums[i - 1] + arr[i - 1]&lt;br /&gt;
&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        x, y, p = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
        total_sum = prefix_sums[y] - prefix_sums[x - 1]&lt;br /&gt;
&lt;br /&gt;
        left = 0&lt;br /&gt;
        right = total_sum&lt;br /&gt;
&lt;br /&gt;
        while left &amp;lt;= right:&lt;br /&gt;
            mid = (left + right) // 2&lt;br /&gt;
&lt;br /&gt;
            count_less = bisect.bisect_left(prefix_sums, mid)&lt;br /&gt;
&lt;br /&gt;
            if count_less &amp;lt; p:&lt;br /&gt;
                left = mid + 1&lt;br /&gt;
            else:&lt;br /&gt;
                right = mid&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
        answer = right&lt;br /&gt;
&lt;br /&gt;
        print(answer)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    arr = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        solve_test_case(n, m, arr)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.stdin = open(&amp;quot;easyxy.in&amp;quot;)&lt;br /&gt;
    sys.stdout = open(&amp;quot;easyxy.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
    main()&lt;br /&gt;
    sys.stdin.close()&lt;br /&gt;
    sys.stdout.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2725_-_Aib&amp;diff=10098</id>
		<title>2725 - Aib</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2725_-_Aib&amp;diff=10098"/>
		<updated>2024-06-04T07:42:26Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Aveți la dispoziție un număr natural nenul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și o permutare &amp;lt;code&amp;gt;a = (a[1], a[2], ..., a[n])&amp;lt;/code&amp;gt; a mulțimii &amp;lt;code&amp;gt;{1, 2, ..., n}&amp;lt;/code&amp;gt;.  = Cerința = Pentru fiecare număr &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt; trebuie să determinați câte numere mai mici decât &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt; se află la stânga sa, adică în secvența &amp;lt;code&amp;gt;a[1], a[2], ..., a[i-1]&amp;lt;/code&amp;gt;.  = Date de intrare = Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Aveți la dispoziție un număr natural nenul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și o permutare &amp;lt;code&amp;gt;a = (a[1], a[2], ..., a[n])&amp;lt;/code&amp;gt; a mulțimii &amp;lt;code&amp;gt;{1, 2, ..., n}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Pentru fiecare număr &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt; trebuie să determinați câte numere mai mici decât &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt; se află la stânga sa, adică în secvența &amp;lt;code&amp;gt;a[1], a[2], ..., a[i-1]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale separate prin spații reprezentând permutarea.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran pentru fiecare &amp;lt;code&amp;gt;i=1..n&amp;lt;/code&amp;gt; câte numere mai mici decât &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt; se află la stânga sa.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ n ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 7&lt;br /&gt;
 3 1 6 5 2 7 4&lt;br /&gt;
Ieșire&lt;br /&gt;
 0 0 2 2 1 5 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Sunt &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; numere mai mici decât &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și aflate la stânga lui &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sunt &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; numere mai mici decât &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și aflate la stânga lui &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sunt &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; numere mai mici decât &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; și aflate la stânga lui &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; (acestea sunt primele două numere din șir, adică &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def count_smaller(arr):&lt;br /&gt;
    n = len(arr)&lt;br /&gt;
    result = [0] * n&lt;br /&gt;
    bit = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    def update(x, val):&lt;br /&gt;
        while x &amp;lt;= n:&lt;br /&gt;
            bit[x] += val&lt;br /&gt;
            x += x &amp;amp; -x&lt;br /&gt;
&lt;br /&gt;
    def query(x):&lt;br /&gt;
        s = 0&lt;br /&gt;
        while x &amp;gt; 0:&lt;br /&gt;
            s += bit[x]&lt;br /&gt;
            x -= x &amp;amp; -x&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, -1, -1):&lt;br /&gt;
        result[i] = query(arr[i])&lt;br /&gt;
        update(arr[i], 1)&lt;br /&gt;
&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti n: &amp;quot;))&lt;br /&gt;
    arr = list(map(int, input(&amp;quot;Introduceti permutarea: &amp;quot;).split()))&lt;br /&gt;
&lt;br /&gt;
    smaller_counts = count_smaller(arr)&lt;br /&gt;
    for count in smaller_counts:&lt;br /&gt;
        print(count, end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2012_-_TSM&amp;diff=10097</id>
		<title>2012 - TSM</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2012_-_TSM&amp;diff=10097"/>
		<updated>2024-06-04T07:38:32Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Enunț = TH, Seba, Șcuțu și Năstuț se joacă noul joc numit TSM. TSM are un sistem de tip multiplayer foarte interesant: se formează două echipe care se vor confrunta, una ce conține &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; jucători ce vor avea rol de apărători și alta ce conține un singur jucător cu rol de atacator (foarte necinstit). Mygo a auzit că cei &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; prieteni și-au făcut echipă, iar pe el nu l-au invitat, așa că decide să îi provoace la joc. Într-o rundă...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Enunț =&lt;br /&gt;
TH, Seba, Șcuțu și Năstuț se joacă noul joc numit TSM. TSM are un sistem de tip multiplayer foarte interesant: se formează două echipe care se vor confrunta, una ce conține &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; jucători ce vor avea rol de apărători și alta ce conține un singur jucător cu rol de atacator (foarte necinstit). Mygo a auzit că cei &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; prieteni și-au făcut echipă, iar pe el nu l-au invitat, așa că decide să îi provoace la joc. Într-o rundă de joc acțiunile se petrec pe un câmp de luptă, inițial gol, iar apărătorii disting următoarele evenimente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 x&amp;lt;/code&amp;gt; : TH observă că Mygo a trimis pe câmpul de luptă un tanc de coeficient &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și își anunță aliații.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 K&amp;lt;/code&amp;gt; : Seba consideră că cel mai periculos tip de tanc aflat pe câmpul de luptă este cel cu al &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; – lea cel mai mic coeficient și îl afișează în consolă, pe un nou rând.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; : Năstuț scrie în consolă, pe un nou rând, coeficientul cel mai mic al unui tanc aflat în momentul respectiv pe câmpul de luptă.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; : Șcuțu trage cu tunul într-un tanc de coeficient egal cu ultimul scris de Seba în consolă și îl elimină.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Pentru un joc cu &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; evenimente, simulați parcursul jocului.&lt;br /&gt;
&lt;br /&gt;
Cei &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; prieteni au folosit aceste două bucăți de cod ca să poată să câștige, așa că ți le oferă și ție:&lt;br /&gt;
&lt;br /&gt;
InParser&lt;br /&gt;
&lt;br /&gt;
OutParser&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;tsm.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul de evenimente, iar pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii câte un eveniment, cu formatul explicat mai sus.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;tsm.out&amp;lt;/code&amp;gt; va conține pentru fiecare eveniment de tipul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, răspunsul lor, fiecare pe câte o linie, în ordinea în care acestea apar în fișierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru evenimentele de tip &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ x ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* se garantează că orice alt eveniment va putea fi procesat.&lt;br /&gt;
* între oricare &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; evenimente de tip &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; va exista cel puțin un eveniment de tip &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;tsm.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 14&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 3&lt;br /&gt;
 1 2&lt;br /&gt;
 1 1&lt;br /&gt;
 1 1&lt;br /&gt;
 3&lt;br /&gt;
 1 4&lt;br /&gt;
 2 3&lt;br /&gt;
 2 1&lt;br /&gt;
 4&lt;br /&gt;
 2 1&lt;br /&gt;
 4&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;code&amp;gt;tsm.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 1&lt;br /&gt;
 3&lt;br /&gt;
 1&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
from heapq import heappush, heappop&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    events = []  # Lista de evenimente&lt;br /&gt;
    tanks = []  # Coada de tancuri (heap)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;tsm.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;tsm.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        m = int(fin.readline())  # Numărul de evenimente&lt;br /&gt;
&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            event = fin.readline().split()&lt;br /&gt;
            event_type = int(event[0])&lt;br /&gt;
            events.append(event)&lt;br /&gt;
&lt;br /&gt;
        for event in events:&lt;br /&gt;
            event_type = int(event[0])&lt;br /&gt;
&lt;br /&gt;
            if event_type == 1:&lt;br /&gt;
                tank_coeff = int(event[1])&lt;br /&gt;
                heappush(tanks, tank_coeff)&lt;br /&gt;
&lt;br /&gt;
            elif event_type == 2:&lt;br /&gt;
                k = len(tanks)&lt;br /&gt;
                if k &amp;gt; 0:&lt;br /&gt;
                    temp_tanks = tanks.copy()&lt;br /&gt;
                    temp_tanks.sort()&lt;br /&gt;
                    fout.write(str(temp_tanks[k - int(event[1])]) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif event_type == 3:&lt;br /&gt;
                if tanks:&lt;br /&gt;
                    fout.write(str(tanks[0]) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif event_type == 4:&lt;br /&gt;
                if tanks:&lt;br /&gt;
                    tank_to_remove = heappop(tanks)&lt;br /&gt;
                    while tanks and tank_to_remove != tanks[0]:&lt;br /&gt;
                        tank_to_remove = heappop(tanks)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2779_-_Cnt_SQ&amp;diff=10096</id>
		<title>2779 - Cnt SQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2779_-_Cnt_SQ&amp;diff=10096"/>
		<updated>2024-06-04T07:35:39Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se dă o matrice binară (valori &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Să se determine câte pătrate există cu proprietatea că acestea au pe marginea lor doar valori &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;cntsq.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul de linii și numărul de coloane ale matricei, apoi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, pe fiecare câte &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; valori &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă o matrice binară (valori &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Să se determine câte pătrate există cu proprietatea că acestea au pe marginea lor doar valori &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;cntsq.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul de linii și numărul de coloane ale matricei, apoi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, pe fiecare câte &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; valori &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, neseparate prin niciun spațiu, reprezentând elementele matricei.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;cntsq.out&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, reprezentând numărul de pătrate ce conțin doar &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; pe marginea lor.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N, M ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se consideră pătrat și cel de latură &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (conține doar un element).&lt;br /&gt;
* Fie un pătrat determinat de &amp;lt;code&amp;gt;(i1, j1)&amp;lt;/code&amp;gt; colțul stânga sus, &amp;lt;code&amp;gt;(i2, j2)&amp;lt;/code&amp;gt; colțul dreapta jos. Se definește marginea pătratului ca fiind mulțimea de puncte &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt; care respectă cel puțin una din condițiile: &amp;lt;code&amp;gt;((x = i1 sau x = i2) și (j1 ≤ y ≤ j2))&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;((y = j1 sau y = j2) și (i1 ≤ x ≤ i2))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;cntsq.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 3&lt;br /&gt;
 111&lt;br /&gt;
 101&lt;br /&gt;
 111&lt;br /&gt;
&amp;lt;code&amp;gt;cntsq.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 9&lt;br /&gt;
&amp;lt;code&amp;gt;cntsq.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 7&lt;br /&gt;
 0000000&lt;br /&gt;
 0111100&lt;br /&gt;
 0101111&lt;br /&gt;
 0100101&lt;br /&gt;
 0111111&lt;br /&gt;
 0000011&lt;br /&gt;
 0000011&lt;br /&gt;
&amp;lt;code&amp;gt;cntsq.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 27&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def count_squares(matrix):&lt;br /&gt;
    n, m = len(matrix), len(matrix[0])&lt;br /&gt;
    dp = [[0] * (m + 1) for _ in range(n + 1)]&lt;br /&gt;
    count = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(1, m + 1):&lt;br /&gt;
            if matrix[i - 1][j - 1] == 1:&lt;br /&gt;
                dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1&lt;br /&gt;
                size = dp[i][j]&lt;br /&gt;
                while size &amp;gt; 0:&lt;br /&gt;
                    count += 1&lt;br /&gt;
                    size -= 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;cntsq.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;cntsq.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        matrix = []&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            row = list(map(int, fin.readline().strip()))&lt;br /&gt;
            matrix.append(row)&lt;br /&gt;
&lt;br /&gt;
        result = count_squares(matrix)&lt;br /&gt;
        fout.write(str(result) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2477_%E2%80%93_Tricolor&amp;diff=10095</id>
		<title>2477 – Tricolor</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2477_%E2%80%93_Tricolor&amp;diff=10095"/>
		<updated>2024-06-04T07:33:02Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Tanaka are un arbore (un tri) cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. El vrea să coloreze nodurile arborelui în alb sau negru astfel încât numărul de perechi (neordonate) de noduri înfrățite să fie maxim. Două noduri sunt înfrățite dacă și numai dacă ambele sunt albe și fie sunt legate direct printr-o muchie, fie lanțul elementar unic dintre ele conține doar noduri negre.  = Cerința = Dându-se un arbore cu &amp;lt;code&amp;gt;N&amp;lt;/code...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tanaka are un arbore (un tri) cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. El vrea să coloreze nodurile arborelui în alb sau negru astfel încât numărul de perechi (neordonate) de noduri înfrățite să fie maxim. Două noduri sunt înfrățite dacă și numai dacă ambele sunt albe și fie sunt legate direct printr-o muchie, fie lanțul elementar unic dintre ele conține doar noduri negre.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dându-se un arbore cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri, să se afle numărul maxim de perechi de noduri înfrățite ale sale care se poate obține.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;tricolor.in&amp;lt;/code&amp;gt; va conține pe primul rând un număr natural nenul &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; ce reprezintă numărul de teste. Urmează &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; teste, fiecare test va descrie un arbore pentru care trebuie să se rezolve cerința. Pe primul rând al unui test apare un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; ce reprezintă numărul de noduri ale arborelui din testul respectiv. Pe următoarele &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; rânduri vor apărea câte o pereche de numere întregi &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt; separate printr-un spațiu, care indică existența unei muchii între nodul &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;tricolor.out&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; rânduri. Fiecare rând va conține soluția pentru câte un test, în aceeași ordine ca în fișierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ T ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 5 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Într-un test oarecare, &amp;lt;code&amp;gt;1 ≤ x, y ≤ N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x ≠ y&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; puncte, &amp;lt;code&amp;gt;T = 1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;N ≤ 15&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; puncte, &amp;lt;code&amp;gt;T = 1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;N ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; puncte, toți arborii descriși au exact &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; frunze și &amp;lt;code&amp;gt;N ≤ 500&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; puncte, pentru toți arborii descriși există exact două noduri ale arborelui de care se leagă toate frunzele, situate la capetele unui lanț elementar și &amp;lt;code&amp;gt;N ≤ 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru alte &amp;lt;code&amp;gt;50&amp;lt;/code&amp;gt; de puncte, &amp;lt;code&amp;gt;N ≤ 500&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de puncte, nu există restricții suplimentare.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;tricolor.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 8&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 2 4&lt;br /&gt;
 4 5&lt;br /&gt;
 5 6&lt;br /&gt;
 6 7&lt;br /&gt;
 6 8&lt;br /&gt;
 2&lt;br /&gt;
 1 2&lt;br /&gt;
&amp;lt;code&amp;gt;tricolor.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;T = 2&amp;lt;/code&amp;gt;, avem două teste în fișierul de intrare. În primul test arborele are &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; noduri și cu o colorare optimă putem obține un număr maxim de &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; perechi de noduri înfrățite.&lt;br /&gt;
&lt;br /&gt;
Perechile înfrățite sunt: &amp;lt;code&amp;gt;(1, 3)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(1, 4)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(3, 4)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(4, 5)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(5, 7)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(5, 8)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(7, 8)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
În al doilea test arborele are &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; noduri legate cu o singură muchie. Este optim să colorăm ambele noduri în alb obținând o pereche de noduri înfrățite.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
&lt;br /&gt;
def maxFriendPairs(N, edges):&lt;br /&gt;
    graph = defaultdict(list)&lt;br /&gt;
    for u, v in edges:&lt;br /&gt;
        graph[u].append(v)&lt;br /&gt;
        graph[v].append(u)&lt;br /&gt;
&lt;br /&gt;
    def dfs(node, parent):&lt;br /&gt;
        nonlocal ans&lt;br /&gt;
        black_count = 0&lt;br /&gt;
        white_count = 1&lt;br /&gt;
&lt;br /&gt;
        for child in graph[node]:&lt;br /&gt;
            if child != parent:&lt;br /&gt;
                black_subtree_count, white_subtree_count = dfs(child, node)&lt;br /&gt;
                black_count += white_subtree_count&lt;br /&gt;
                white_count += black_subtree_count&lt;br /&gt;
&lt;br /&gt;
        ans = max(ans, black_count * (black_count - 1) // 2 + white_count * (white_count - 1) // 2)&lt;br /&gt;
        return black_count, white_count&lt;br /&gt;
&lt;br /&gt;
    ans = 0&lt;br /&gt;
    dfs(1, -1)&lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;tricolor.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;tricolor.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        T = int(fin.readline())&lt;br /&gt;
        for _ in range(T):&lt;br /&gt;
            N = int(fin.readline())&lt;br /&gt;
            edges = []&lt;br /&gt;
            for _ in range(N - 1):&lt;br /&gt;
                u, v = map(int, fin.readline().split())&lt;br /&gt;
                edges.append((u, v))&lt;br /&gt;
            fout.write(str(maxFriendPairs(N, edges)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1757_%E2%80%93_Sec&amp;diff=10094</id>
		<title>1757 – Sec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1757_%E2%80%93_Sec&amp;diff=10094"/>
		<updated>2024-06-04T07:08:48Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: În timp ce-și bea sortimentul preferat de vin sec, vrăjitorului Arpsod i-a venit în minte o problemă de informatică ce are un enunț cel puțin la fel de sec și anume:  Dându-se un arbore binar cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri și rădăcina în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, să se răspundă la &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări de forma: “sunt cei doi fii ai nodului &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; identici?”  Doi fii sunt identici dacă au același număr de subarbori și aceștia sunt identici (mai ex...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În timp ce-și bea sortimentul preferat de vin sec, vrăjitorului Arpsod i-a venit în minte o problemă de informatică ce are un enunț cel puțin la fel de sec și anume:&lt;br /&gt;
&lt;br /&gt;
Dându-se un arbore binar cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri și rădăcina în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, să se răspundă la &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări de forma: “sunt cei doi fii ai nodului &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; identici?”&lt;br /&gt;
&lt;br /&gt;
Doi fii sunt identici dacă au același număr de subarbori și aceștia sunt identici (mai exact, pentru orice &amp;lt;code&amp;gt;i=1, 2, ..., N&amp;lt;/code&amp;gt; subarborele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; al primului este identic cu subarborele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; al celui de-al doilea).&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscându-se arborele, să se răspundă la cele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări de forma indicată în enunţ.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fișierului &amp;lt;code&amp;gt;sec.in&amp;lt;/code&amp;gt; se află numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul de noduri ale arborelui. Următoarele &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; linii conțin perechi de forma &amp;lt;code&amp;gt;( x, y )&amp;lt;/code&amp;gt; cu semnificația că există muchie între nodul &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;. Pe a &amp;lt;code&amp;gt;(N+1)&amp;lt;/code&amp;gt;-a linie se va afla numărul natural &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;, reprezentând numărul de întrebări. Pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii se va afla câte un număr natural reprezentând eticheta nodului ai cărui fii vor fi analizați.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;sec.out&amp;lt;/code&amp;gt; va avea &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii. Pe fiecare linie va fi scris cuvântul &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt; dacă cei doi fii sunt identici respectiv &amp;lt;code&amp;gt;NU&amp;lt;/code&amp;gt; în caz contrar .&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 500.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nodurile arborelui sunt etichetate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Rădăcina va fi mereu în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Fii NU sunt identici dacă unul dintre ei trebuie oglindit / rotit pentru a arăta ca celălalt.&lt;br /&gt;
* În cazul în care nodul cerut nu are fii, se va afișa &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt; (se consideră că sunt doi fii &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; identici)&lt;br /&gt;
* Se garantează că pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;1 ≤ N ≤ 1000&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1 ≤ Q ≤ 3000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;sec.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 9&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 3 6&lt;br /&gt;
 4 8&lt;br /&gt;
 5 9&lt;br /&gt;
 6 7&lt;br /&gt;
 4&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 7&lt;br /&gt;
&amp;lt;code&amp;gt;sec.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 NU&lt;br /&gt;
 DA&lt;br /&gt;
 NU&lt;br /&gt;
 DA&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Nodurile 2, 7, 8, 9 au ambii fii identici. Celelalte noduri nu au aceasta proprietate&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict, deque&lt;br /&gt;
import hashlib&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
sys.setrecursionlimit(300000)&lt;br /&gt;
&lt;br /&gt;
def read_input(file):&lt;br /&gt;
    with open(file, &#039;r&#039;) as f:&lt;br /&gt;
        data = f.read().split()&lt;br /&gt;
    index = 0&lt;br /&gt;
    N = int(data[index])&lt;br /&gt;
    index += 1&lt;br /&gt;
    edges = []&lt;br /&gt;
    for _ in range(N - 1):&lt;br /&gt;
        x = int(data[index])&lt;br /&gt;
        y = int(data[index + 1])&lt;br /&gt;
        index += 2&lt;br /&gt;
        edges.append((x, y))&lt;br /&gt;
    Q = int(data[index])&lt;br /&gt;
    index += 1&lt;br /&gt;
    queries = []&lt;br /&gt;
    for _ in range(Q):&lt;br /&gt;
        queries.append(int(data[index]))&lt;br /&gt;
        index += 1&lt;br /&gt;
    return N, edges, Q, queries&lt;br /&gt;
&lt;br /&gt;
def build_tree(N, edges):&lt;br /&gt;
    tree = defaultdict(list)&lt;br /&gt;
    for x, y in edges:&lt;br /&gt;
        tree[x].append(y)&lt;br /&gt;
        tree[y].append(x)&lt;br /&gt;
    return tree&lt;br /&gt;
&lt;br /&gt;
def dfs(node, parent, tree, hashes):&lt;br /&gt;
    children = []&lt;br /&gt;
    for child in tree[node]:&lt;br /&gt;
        if child != parent:&lt;br /&gt;
            children.append(dfs(child, node, tree, hashes))&lt;br /&gt;
    &lt;br /&gt;
    children.sort()&lt;br /&gt;
    subtree_hash = hashlib.sha256(&#039;&#039;.join(children).encode()).hexdigest()&lt;br /&gt;
    hashes[node] = subtree_hash&lt;br /&gt;
    return subtree_hash&lt;br /&gt;
&lt;br /&gt;
def solve(N, edges, Q, queries):&lt;br /&gt;
    tree = build_tree(N, edges)&lt;br /&gt;
    hashes = {}&lt;br /&gt;
    &lt;br /&gt;
    dfs(1, -1, tree, hashes)&lt;br /&gt;
    &lt;br /&gt;
    results = []&lt;br /&gt;
    for node in queries:&lt;br /&gt;
        children = [child for child in tree[node] if child != node]&lt;br /&gt;
        if len(children) &amp;lt; 2:&lt;br /&gt;
            results.append(&amp;quot;DA&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            if hashes[children[0]] == hashes[children[1]]:&lt;br /&gt;
                results.append(&amp;quot;DA&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                results.append(&amp;quot;NU&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return results&lt;br /&gt;
&lt;br /&gt;
def write_output(file, results):&lt;br /&gt;
    with open(file, &#039;w&#039;) as f:&lt;br /&gt;
        for result in results:&lt;br /&gt;
            f.write(result + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N, edges, Q, queries = read_input(&#039;sec.in&#039;)&lt;br /&gt;
    results = solve(N, edges, Q, queries)&lt;br /&gt;
    write_output(&#039;sec.out&#039;, results)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4229_%E2%80%93_Kdist&amp;diff=10093</id>
		<title>4229 – Kdist</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4229_%E2%80%93_Kdist&amp;diff=10093"/>
		<updated>2024-06-04T06:53:24Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Bujorel s-a apucat de pomicultură şi a însămânţat un arbore (graf conex aciclic) cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri, fiecare nod având o culoare dată dintr-un interval &amp;lt;code&amp;gt;[1, K]&amp;lt;/code&amp;gt;. Acum, după ce arborele a crescut, el doreşte să ştie, pentru fiecare culoare, suma distanţelor dintre toate perechile de noduri ale arborelui ce au culoarea respectivă. Distanţa dintre două noduri se defineşte ca fiind numărul de muchii de pe drumul dintre cele două noduri.  = Ceri...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bujorel s-a apucat de pomicultură şi a însămânţat un arbore (graf conex aciclic) cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri, fiecare nod având o culoare dată dintr-un interval &amp;lt;code&amp;gt;[1, K]&amp;lt;/code&amp;gt;. Acum, după ce arborele a crescut, el doreşte să ştie, pentru fiecare culoare, suma distanţelor dintre toate perechile de noduri ale arborelui ce au culoarea respectivă. Distanţa dintre două noduri se defineşte ca fiind numărul de muchii de pe drumul dintre cele două noduri.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Deoarece Bujorel a folosit foarte mult îngrăşământ la plantarea arborelui, acesta a crescut foarte mult şi voi trebuie să scrieţi un program care calculează suma distanţelor dintre nodurile cu aceeaşi culoare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie se află două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, numărul de noduri ale arborelui, respectiv numărul de culori în care sunt vopsite nodurile. Pe următoarele &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; linii este descris arborele, fiecare linie conţinând două numere naturale &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, reprezentând o muchie dintre nodul &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; şi nodul &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;. În continuare sunt prezente &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-a dintre aceste linii având un număr întreg &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; aparţinând intervalului &amp;lt;code&amp;gt;[1, K]&amp;lt;/code&amp;gt; reprezentând culoarea nodului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Se vor afișa &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; linii, cea de-a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-a linie conţinând suma distanţelor dintre toate perechile de noduri ce au culoarea i.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ K ≤  N ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* În calcularea sumei distanţelor dintre nodurile cu aceeaşi culoare, fiecare pereche de noduri &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt; va fi considerată o singură dată.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 6 3&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 3 4&lt;br /&gt;
 3 5&lt;br /&gt;
 5 6&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 2&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 2&lt;br /&gt;
 6&lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Pentru culoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; avem o pereche: &amp;lt;code&amp;gt;(1, 4)&amp;lt;/code&amp;gt;, cu distanţa &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. Pentru culoarea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; avem trei perechi: &amp;lt;code&amp;gt;(2, 3)&amp;lt;/code&amp;gt; cu distanţa &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(2, 5)&amp;lt;/code&amp;gt; cu distanţa &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(3, 5)&amp;lt;/code&amp;gt; cu distanţa &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Pentru culoarea &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; avem un singur nod cu această culoare, deci răspunsul este &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.\&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict, deque&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_color_distances(n, k, edges, colors):&lt;br /&gt;
 &lt;br /&gt;
    tree = defaultdict(list)&lt;br /&gt;
    for u, v in edges:&lt;br /&gt;
        tree[u].append(v)&lt;br /&gt;
        tree[v].append(u)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    color_nodes = defaultdict(list)&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        color_nodes[colors[i]].append(i + 1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def bfs_distance_sum(start, valid_nodes):&lt;br /&gt;
        visited = set()&lt;br /&gt;
        queue = deque([(start, 0)])&lt;br /&gt;
        visited.add(start)&lt;br /&gt;
        distance_sum = 0&lt;br /&gt;
        node_count = 0&lt;br /&gt;
&lt;br /&gt;
        while queue:&lt;br /&gt;
            node, dist = queue.popleft()&lt;br /&gt;
            distance_sum += dist&lt;br /&gt;
            node_count += 1&lt;br /&gt;
&lt;br /&gt;
            for neighbor in tree[node]:&lt;br /&gt;
                if neighbor not in visited and neighbor in valid_nodes:&lt;br /&gt;
                    visited.add(neighbor)&lt;br /&gt;
                    queue.append((neighbor, dist + 1))&lt;br /&gt;
&lt;br /&gt;
        return distance_sum, node_count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    color_distance_sums = [0] * k&lt;br /&gt;
    for color in range(1, k + 1):&lt;br /&gt;
        nodes = color_nodes[color]&lt;br /&gt;
        if len(nodes) &amp;lt; 2:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        total_distance_sum = 0&lt;br /&gt;
        for node in nodes:&lt;br /&gt;
            dist_sum, node_count = bfs_distance_sum(node, set(nodes))&lt;br /&gt;
            total_distance_sum += dist_sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        color_distance_sums[color - 1] = total_distance_sum // 2&lt;br /&gt;
&lt;br /&gt;
    return color_distance_sums&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n, k = map(int, input().split())&lt;br /&gt;
edges = [tuple(map(int, input().split())) for _ in range(n - 1)]&lt;br /&gt;
colors = [int(input()) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
result = calculate_color_distances(n, k, edges, colors)&lt;br /&gt;
for dist_sum in result:&lt;br /&gt;
    print(dist_sum)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1200_%E2%80%93_Spiridu%C8%99i&amp;diff=10092</id>
		<title>1200 – Spiriduși</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1200_%E2%80%93_Spiridu%C8%99i&amp;diff=10092"/>
		<updated>2024-06-04T03:51:57Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Mei și Satsuki s-au întors de curând în casa de vacanță a familiei lor. Această casă este formată din &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; camere, unite între ele prin &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; culoare, astfel încât să se poată ajunge din orice cameră în orice altă cameră. Intrarea în casă se face prin camera &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Deoarece casa n-a fost locuită timp de mai multe luni, în fiecare cameră &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; s-au stabilit &amp;lt;code&amp;gt;s[i]&amp;lt;/code&amp;gt; spiriduși de praf.  Cele două fete dore...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mei și Satsuki s-au întors de curând în casa de vacanță a familiei lor. Această casă este formată din &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; camere, unite între ele prin &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; culoare, astfel încât să se poată ajunge din orice cameră în orice altă cameră. Intrarea în casă se face prin camera &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Deoarece casa n-a fost locuită timp de mai multe luni, în fiecare cameră &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; s-au stabilit &amp;lt;code&amp;gt;s[i]&amp;lt;/code&amp;gt; spiriduși de praf.&lt;br /&gt;
&lt;br /&gt;
Cele două fete doresc să-și amenajeze un spațiu de joacă întins pe mai multe camere. Ele vor să stabilească două camere &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (nu neapărat distincte), astfel încât drumul cel mai scurt de la intrarea în casă până în camera &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; trece prin camera &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;. Fetele vor merge apoi din camera &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; în camera &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; pe drumul cel mai scurt (fără a trece de două ori prin aceeași cameră), gonind spiridușii de praf aflați în fiecare cameră prin care trec, inclusiv pe cei din camerele &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. După ce fetele ajung în camera &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, ele consideră că toate camerele din care au gonit spiridușii de praf au fost alese pentru spațiul de joacă.&lt;br /&gt;
&lt;br /&gt;
Fetele au stabilit pentru fiecare cameră &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; un coeficient &amp;lt;code&amp;gt;p[i]&amp;lt;/code&amp;gt; care reprezintă cât de plăcută ar fi camera &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; pentru spațiul lor de joacă. În plus, ele au convenit că nu vor goni în total mai mult de &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; spiriduși ai prafului din camerele prin care trec.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând valorile lui &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, numărul de spiriduși ai prafului &amp;lt;code&amp;gt;s[i]&amp;lt;/code&amp;gt;, coeficienții &amp;lt;code&amp;gt;p[i]&amp;lt;/code&amp;gt; pentru fiecare cameră &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, cât și modul în care sunt unite camerele prin culoare, să se determine suma maximă a coeficienților &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; ai camerelor alese pentru un spațiu de joacă ce respectă condițiile impuse de Mei și Satsuki.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fișierului de intrare &amp;lt;code&amp;gt;spiridusi.in&amp;lt;/code&amp;gt; se vor afla două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; cu semnificația din enunț. Pe a doua linie se vor afla &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale separate prin câte un spațiu, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea dintre acestea reprezentând numărul de spiriduși &amp;lt;code&amp;gt;s[i]&amp;lt;/code&amp;gt; aflați în camera &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Pe a treia linie se vor afla &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi separate prin câte un spațiu, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea dintre acestea reprezentând coeficientul &amp;lt;code&amp;gt;p[i]&amp;lt;/code&amp;gt; al camerei &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; linii se vor afla câte două numere întregi &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; separate printr-un spațiu, semnificând existența unui culoar ce unește camerele &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul de ieșire &amp;lt;code&amp;gt;spiridusi.out&amp;lt;/code&amp;gt; se va afișa o singură linie conținând un singur număr natural, reprezentând suma maximă a coeficienților &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; ai camerelor alese pentru un spațiu de joacă ce respectă condițiile impuse de Mei și Satsuki.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ C ≤ 20 000 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ s[i] ≤ 20 000 000&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-10 000 ≤ p[i] ≤ 10 000&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ x, y ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 20% din teste, fiecare cameră are maximum &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; vecini.&lt;br /&gt;
* Pentru 30% din teste, &amp;lt;code&amp;gt;N ≤ 1 000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Se garantează că pentru orice cameră &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, numărul total de spiriduși aflați în camerele de pe drumul cel mai scurt de la camera &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la camera &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; nu depășește &amp;lt;code&amp;gt;1 000 000 000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;spiridusi.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 8&lt;br /&gt;
 2 4 6 2 4 1 &lt;br /&gt;
 3 10 11 -2 4 5&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 2 4&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
&amp;lt;code&amp;gt;spiridusi.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 13&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Dacă alegem camerele &amp;lt;code&amp;gt;a = 2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b = 6&amp;lt;/code&amp;gt;, obținem un spațiu de joacă format din camerele &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Numărul total de spiriduși goniți din aceste camere este &amp;lt;code&amp;gt;4 + 2 + 1 = 7&amp;lt;/code&amp;gt;, care este mai mic sau egal decât &amp;lt;code&amp;gt;C = 8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Suma coeficienților &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; ai acestor camere este &amp;lt;code&amp;gt;10 + (-2) + 5 = 13&amp;lt;/code&amp;gt;, maximul posibil ce se poate obține.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
nmax = 10**5&lt;br /&gt;
logmax = 17&lt;br /&gt;
&lt;br /&gt;
dx = [[] for _ in range(nmax+5)]&lt;br /&gt;
up = [[0] * (logmax+5) for _ in range(nmax+5)]&lt;br /&gt;
sum_val = [[0] * (logmax+5) for _ in range(nmax+5)]&lt;br /&gt;
Psum = [[0] * (logmax+5) for _ in range(nmax+5)]&lt;br /&gt;
&lt;br /&gt;
def build(node, father):&lt;br /&gt;
    for i in range(1, logmax+1):&lt;br /&gt;
        up[node][i] = up[up[node][i-1]][i-1]&lt;br /&gt;
        sum_val[node][i] = sum_val[node][i-1] + sum_val[up[node][i-1]][i-1]&lt;br /&gt;
        Psum[node][i] = Psum[node][i-1] + Psum[up[node][i-1]][i-1]&lt;br /&gt;
    for next_node in dx[node]:&lt;br /&gt;
        if next_node != father:&lt;br /&gt;
            up[next_node][0] = node&lt;br /&gt;
            sum_val[next_node][0] = s[node]&lt;br /&gt;
            Psum[next_node][0] = p[node]&lt;br /&gt;
            build(next_node, node)&lt;br /&gt;
&lt;br /&gt;
def dfs(node, father):&lt;br /&gt;
    for next_node in dx[node]:&lt;br /&gt;
        if next_node != father:&lt;br /&gt;
            if s[next_node] &amp;gt; c:&lt;br /&gt;
                dfs(next_node, node)&lt;br /&gt;
            else:&lt;br /&gt;
                next_S = s[next_node]&lt;br /&gt;
                next_P = p[next_node]&lt;br /&gt;
                next_A = next_node&lt;br /&gt;
                for i in range(logmax, -1, -1):&lt;br /&gt;
                    if up[next_A][i] and next_S + sum_val[next_A][i] &amp;lt;= c:&lt;br /&gt;
                        next_S += sum_val[next_A][i]&lt;br /&gt;
                        next_P += Psum[next_A][i]&lt;br /&gt;
                        next_A = up[next_A][i]&lt;br /&gt;
                dp[next_node] = max(next_P, p[next_node])&lt;br /&gt;
                dfs(next_node, node)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.stdin = open(&amp;quot;spiridusi.in&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    sys.stdout = open(&amp;quot;spiridusi.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    n, c = map(int, input().split())&lt;br /&gt;
    s = [0] * (nmax+5)&lt;br /&gt;
    p = [0] * (nmax+5)&lt;br /&gt;
    dp = [0] * (nmax+5)&lt;br /&gt;
    ans = 0&lt;br /&gt;
&lt;br /&gt;
    s_input = input().split()&lt;br /&gt;
    p_input = input().split()&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        s[i] = int(s_input[i-1])&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        p[i] = int(p_input[i-1])&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        x, y = map(int, input().split())&lt;br /&gt;
        dx[x].append(y)&lt;br /&gt;
        dx[y].append(x)&lt;br /&gt;
    build(1, 0)&lt;br /&gt;
    if s[1] &amp;lt;= c:&lt;br /&gt;
        dp[1] = p[1]&lt;br /&gt;
    dfs(1, 0)&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        ans = max(ans, dp[i])&lt;br /&gt;
    print(ans)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1116_%E2%80%93_Karb&amp;diff=10091</id>
		<title>1116 – Karb</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1116_%E2%80%93_Karb&amp;diff=10091"/>
		<updated>2024-06-04T03:46:30Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  În perioada Campionatului Mondial din Brazilia se preconizează o creştere a traficului de cafea. Se ştie că sunt &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orase, conectate prin &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; străzi bidirecţionale, astfel încât se poate ajunge din orice oraş în altul. În prezent există &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; carteluri de cafea aflate în oraşe distincte, care își exercita influența în propriul oraș. Se ştie că fiecare din aceste carteluri doreşte să-şi extindă influenţa în oraşel...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
În perioada Campionatului Mondial din Brazilia se preconizează o creştere a traficului de cafea. Se ştie că sunt &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orase, conectate prin &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; străzi bidirecţionale, astfel încât se poate ajunge din orice oraş în altul. În prezent există &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; carteluri de cafea aflate în oraşe distincte, care își exercita influența în propriul oraș. Se ştie că fiecare din aceste carteluri doreşte să-şi extindă influenţa în oraşele vecine. Astfel, la un moment de timp, un cartel poate să-şi extindă influenţa într-un oraş vecin doar dacă acesta nu se află sub influenţa altui cartel. O dată ce un cartel îşi extinde influenta asupra unui nou oraş, cartelul îşi poate extinde influenţa şi în oraşele vecine acestuia. Se ştie că până la începerea campionatului mondial, fiecare oraş va fi sub influenţa unui cartel.&lt;br /&gt;
&lt;br /&gt;
ABIN (Agência Brasileira de Inteligência) doreşte să afle în câte moduri poate fi dominată ţara de influenţele celor &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; carteluri la data începerii campionatului mondial, modulo &amp;lt;code&amp;gt;666013&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerință =&lt;br /&gt;
Cunoscând numărul de orașe &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, modul în care acestea sunt conectate, numărul de carteluri inițiale &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; și cele &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; orașe în care se află cartelurile, să se determine numărul de moduri în care ţara poate fi împărţită între cartelurile de cafea, modulo &amp;lt;code&amp;gt;666013&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;karb.in&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, reprezentând numărul de oraşe, respectiv numărul cartelurilor existente iniţial. Pe a doua linie din fişier se vor afla &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; numere, reprezentând oraşele în care se află cele &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; carteluri. Pe următoarele &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; linii se vor afla câte două numere naturale, reprezentând o legătură între cele două oraşe.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;karb.out&amp;lt;/code&amp;gt; va conține pe prima linie un singur număr natural reprezentând numărul de moduri modulo &amp;lt;code&amp;gt;666013&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ K ≤ N ≤ 100 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru teste în valoare de 10% din punctaj se garantează că &amp;lt;code&amp;gt;k ≤ n ≤ 7&amp;lt;/code&amp;gt;, iar pentru alte 20% din teste se garantează că &amp;lt;code&amp;gt;k = 2&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Două oraşe sunt vecine dacă există o stradă bidirecțională între ele.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;karb.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 3&lt;br /&gt;
 3 4 5&lt;br /&gt;
 1 2 &lt;br /&gt;
 1 3 &lt;br /&gt;
 2 4 &lt;br /&gt;
 2 5 &lt;br /&gt;
 4 6&lt;br /&gt;
&amp;lt;code&amp;gt;karb.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Cele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; moduri posibile:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;(3) (1, 2, 5) (4, 6)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;(3, 1) (2, 5) (4, 6)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;(3, 1, 2) (5) (4, 6)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;(3, 1) (5) (2, 4, 6)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;(3) (5) (1, 2, 4, 6)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
from collections import defaultdict, deque&lt;br /&gt;
&lt;br /&gt;
MOD = 666013&lt;br /&gt;
&lt;br /&gt;
def dfs(nod, G, special, viz, T, D):&lt;br /&gt;
    viz[nod] = True&lt;br /&gt;
&lt;br /&gt;
    sons = 0&lt;br /&gt;
    for fiu in G[nod]:&lt;br /&gt;
        if viz[fiu]:&lt;br /&gt;
            continue&lt;br /&gt;
        sons += 1&lt;br /&gt;
        T[fiu] = nod&lt;br /&gt;
        dfs(fiu, G, special, viz, T, D)&lt;br /&gt;
&lt;br /&gt;
    if sons == 0:&lt;br /&gt;
        if special[nod]:&lt;br /&gt;
            D[nod][0] = 0&lt;br /&gt;
            D[nod][1] = 1&lt;br /&gt;
        else:&lt;br /&gt;
            D[nod][0] = 1&lt;br /&gt;
            D[nod][1] = 0&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    localD = [[1] * (sons + 1), [0] * (sons + 1)]&lt;br /&gt;
&lt;br /&gt;
    ind = 0&lt;br /&gt;
    for fiu in G[nod]:&lt;br /&gt;
        if T[fiu] != nod:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        ind += 1&lt;br /&gt;
        localD[0][ind] = (localD[0][ind - 1] * (D[fiu][0] + D[fiu][1])) % MOD&lt;br /&gt;
        localD[1][ind] = (localD[0][ind - 1] * D[fiu][1] + localD[1][ind - 1] * (D[fiu][0] + D[fiu][1])) % MOD&lt;br /&gt;
&lt;br /&gt;
    if not special[nod]:&lt;br /&gt;
        D[nod][0] = localD[0][ind]&lt;br /&gt;
        D[nod][1] = localD[1][ind]&lt;br /&gt;
    else:&lt;br /&gt;
        D[nod][0] = 0&lt;br /&gt;
        D[nod][1] = localD[0][ind]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    sys.stdin = open(&amp;quot;karb.in&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    sys.stdout = open(&amp;quot;karb.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    n, k = map(int, sys.stdin.readline().split())&lt;br /&gt;
    special = [0] * (n + 1)&lt;br /&gt;
    viz = [False] * (n + 1)&lt;br /&gt;
    T = [0] * (n + 1)&lt;br /&gt;
    D = [[0, 0] for _ in range(n + 1)]&lt;br /&gt;
    G = defaultdict(list)&lt;br /&gt;
&lt;br /&gt;
    cartel_cities = list(map(int, sys.stdin.readline().split()))&lt;br /&gt;
    for x in cartel_cities:&lt;br /&gt;
        special[x] = x&lt;br /&gt;
&lt;br /&gt;
    for _ in range(n - 1):&lt;br /&gt;
        x, y = map(int, sys.stdin.readline().split())&lt;br /&gt;
        G[x].append(y)&lt;br /&gt;
        G[y].append(x)&lt;br /&gt;
&lt;br /&gt;
    dfs(1, G, special, viz, T, D)&lt;br /&gt;
&lt;br /&gt;
    print(D[1][1])&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4063_%E2%80%93_Cartierul&amp;diff=10090</id>
		<title>4063 – Cartierul</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4063_%E2%80%93_Cartierul&amp;diff=10090"/>
		<updated>2024-06-04T03:40:37Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Avem în cartier un arbore cu nodurile colorate și cu rădăcina nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Pentru fiecare nod &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; al arborelui să se afișeze câte culori distincte sunt în subarborele cu rădăcina în &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.  = Date de intrare = Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, reprezentând numărul de noduri al arborelui. Pe a doua linie se vor afla &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori, cea de a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; reprezentând culoarea nodului &amp;lt;c...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Avem în cartier un arbore cu nodurile colorate și cu rădăcina nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Pentru fiecare nod &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; al arborelui să se afișeze câte culori distincte sunt în subarborele cu rădăcina în &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, reprezentând numărul de noduri al arborelui. Pe a doua linie se vor afla &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori, cea de a &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; reprezentând culoarea nodului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Urmează &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; linii, pe fiecare linie aflânduse &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;a b&amp;lt;/code&amp;gt; indicând faptul ca între &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; este muchie.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere, cel de al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea fiind numărul de culori distincte din subarborele cu rădăcina în &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Culorile arborelui sunt numere naturale mai mici sau egale cu &amp;lt;code&amp;gt;1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5&lt;br /&gt;
 2 3 2 2 1&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 3 4&lt;br /&gt;
 3 5&lt;br /&gt;
Ieșire&lt;br /&gt;
 3 1 2 1 1&lt;br /&gt;
&lt;br /&gt;
== Rezovlare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict, deque&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distinct_colors_in_subtrees(n, colors, edges):&lt;br /&gt;
  &lt;br /&gt;
    tree = defaultdict(list)&lt;br /&gt;
    for a, b in edges:&lt;br /&gt;
        tree[a].append(b)&lt;br /&gt;
        tree[b].append(a)&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    subtree_colors = [set() for _ in range(n + 1)]&lt;br /&gt;
    result = [0] * (n + 1)&lt;br /&gt;
    visited = [False] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    def dfs(node):&lt;br /&gt;
        visited[node] = True&lt;br /&gt;
        subtree_colors[node].add(colors[node - 1])  # Add the color of the current node&lt;br /&gt;
        for neighbor in tree[node]:&lt;br /&gt;
            if not visited[neighbor]:&lt;br /&gt;
                dfs(neighbor)&lt;br /&gt;
                # Merge the color sets of the subtrees&lt;br /&gt;
                if len(subtree_colors[neighbor]) &amp;gt; len(subtree_colors[node]):&lt;br /&gt;
                    subtree_colors[node], subtree_colors[neighbor] = subtree_colors[neighbor], subtree_colors[node]&lt;br /&gt;
                subtree_colors[node].update(subtree_colors[neighbor])&lt;br /&gt;
        result[node] = len(subtree_colors[node])&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    dfs(1)&lt;br /&gt;
&lt;br /&gt;
    return result[1:]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
colors = list(map(int, input().split()))&lt;br /&gt;
edges = [tuple(map(int, input().split())) for _ in range(n - 1)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
result = distinct_colors_in_subtrees(n, colors, edges)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;\n&amp;quot;.join(map(str, result)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4155_-_Harta3&amp;diff=10089</id>
		<title>4155 - Harta3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4155_-_Harta3&amp;diff=10089"/>
		<updated>2024-06-04T03:30:31Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Harta unei regiuni este reprezentată într-un sistem de coordonate cartezian și sunt cunoscute coordonatele a &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; orașe, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  Se dorește construirea unor drumuri bidirecționale între anumite perechi de orașe, astfel încât:  * să se poate ajunge din orice oraș în oricare altul folosind unul sau mai multe dintre drumurile construite; * suma lungimilor drumurilor construite să fie minimă.  Să...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Harta unei regiuni este reprezentată într-un sistem de coordonate cartezian și sunt cunoscute coordonatele a &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; orașe, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se dorește construirea unor drumuri bidirecționale între anumite perechi de orașe, astfel încât:&lt;br /&gt;
&lt;br /&gt;
* să se poate ajunge din orice oraș în oricare altul folosind unul sau mai multe dintre drumurile construite;&lt;br /&gt;
* suma lungimilor drumurilor construite să fie minimă.&lt;br /&gt;
&lt;br /&gt;
Să se determine suma lungimilor drumurilor construite.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;harta3.in&amp;lt;/code&amp;gt; conține pe prima linie numărul de orașe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe fiecare dintre următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii câte două numere întregi &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;, reprezentând coordonatele acestora.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;harta3.out&amp;lt;/code&amp;gt; va conține pe prima linie suma lungimilor drumurilor construite, cu cel puțin trei zecimale exacte.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;;&lt;br /&gt;
* coordonatele orașelor sunt din intervalul &amp;lt;code&amp;gt;[-200, 200]&amp;lt;/code&amp;gt;;&lt;br /&gt;
* lungimea drumului dintre două orașe se determină cu formula , unde  și  sunt coordonatele acestora.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;harta3.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 1 2&lt;br /&gt;
 2 -1&lt;br /&gt;
 6 5&lt;br /&gt;
 4 2&lt;br /&gt;
&amp;lt;code&amp;gt;harta3.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 9.7678&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
class Muchie:&lt;br /&gt;
    def __init__(self, i, j, cost):&lt;br /&gt;
        self.i = i&lt;br /&gt;
        self.j = j&lt;br /&gt;
        self.cost = cost&lt;br /&gt;
&lt;br /&gt;
def find(P, i):&lt;br /&gt;
    if P[i] == i:&lt;br /&gt;
        return i&lt;br /&gt;
    else:&lt;br /&gt;
        P[i] = find(P, P[i])&lt;br /&gt;
        return P[i]&lt;br /&gt;
&lt;br /&gt;
def union(P, rank, x, y):&lt;br /&gt;
    root_x = find(P, x)&lt;br /&gt;
    root_y = find(P, y)&lt;br /&gt;
    if root_x != root_y:&lt;br /&gt;
        if rank[root_x] &amp;gt; rank[root_y]:&lt;br /&gt;
            P[root_y] = root_x&lt;br /&gt;
        elif rank[root_x] &amp;lt; rank[root_y]:&lt;br /&gt;
            P[root_x] = root_y&lt;br /&gt;
        else:&lt;br /&gt;
            P[root_y] = root_x&lt;br /&gt;
            rank[root_x] += 1&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;harta3.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        x = [0] * (n + 1)&lt;br /&gt;
        y = [0] * (n + 1)&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            x[i], y[i] = map(int, fin.readline().strip().split())&lt;br /&gt;
&lt;br /&gt;
    M = []&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        for j in range(i + 1, n + 1):&lt;br /&gt;
            cost = math.sqrt((x[i] - x[j]) ** 2 + (y[i] - y[j]) ** 2)&lt;br /&gt;
            M.append(Muchie(i, j, cost))&lt;br /&gt;
    &lt;br /&gt;
    M.sort(key=lambda muchie: muchie.cost)&lt;br /&gt;
&lt;br /&gt;
    P = [i for i in range(n + 1)]&lt;br /&gt;
    rank = [0] * (n + 1)&lt;br /&gt;
    S = 0.0&lt;br /&gt;
&lt;br /&gt;
    for muchie in M:&lt;br /&gt;
        if find(P, muchie.i) != find(P, muchie.j):&lt;br /&gt;
            union(P, rank, muchie.i, muchie.j)&lt;br /&gt;
            S += muchie.cost&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;harta3.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{S:.4f}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4118_-_regate&amp;diff=10088</id>
		<title>4118 - regate</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4118_-_regate&amp;diff=10088"/>
		<updated>2024-06-04T03:27:09Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: În tărâmul ONI se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; regate legate între ele prin &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; muchii bidirecționale. Se garantează că se poate ajunge de la orice regat la oricare alt regat folosind aceste muchii. Aceste regate vor să facă alianțe între ele și se vor folosi de puncte de frontieră pentru a realiza acest lucru.  Fiecare muchie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i ≤ M&amp;lt;/code&amp;gt;, are asociat un număr natural &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt; reprezentând costul construcției unu...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În tărâmul ONI se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; regate legate între ele prin &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; muchii bidirecționale. Se garantează că se poate ajunge de la orice regat la oricare alt regat folosind aceste muchii. Aceste regate vor să facă alianțe între ele și se vor folosi de puncte de frontieră pentru a realiza acest lucru.&lt;br /&gt;
&lt;br /&gt;
Fiecare muchie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i ≤ M&amp;lt;/code&amp;gt;, are asociat un număr natural &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt; reprezentând costul construcției unui punct de frontieră pe aceasta. Mai mult decât atât, fiecare regat &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;, are asociat un număr natural &amp;lt;code&amp;gt;r[i]&amp;lt;/code&amp;gt; reprezentând costul construcției unui punct de frontieră la intrarea acestuia.&lt;br /&gt;
&lt;br /&gt;
Pentru ca regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; să intre într-o alianță cu regatul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ X, Y ≤ N, X ≠ Y&amp;lt;/code&amp;gt;, acesta are două opțiuni:&lt;br /&gt;
&lt;br /&gt;
* construiește un punct de frontieră pe o singură muchie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; cu cost &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt;, astfel încât orice drum de la &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; trece prin acest punct de frontieră;&lt;br /&gt;
* construiește un punct de frontieră la intrarea regatului său (regatului &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;) cu cost &amp;lt;code&amp;gt;r[X]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Evident, regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; va alege costul minim pentru a intra într-o alianță cu regatul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;. Vom nota acest cost minim cu &amp;lt;code&amp;gt;Cost(X, Y)&amp;lt;/code&amp;gt;. Atenție, costul ca regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; să intre într-o alianță cu regatul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; poate fi diferit de costul ca regatul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; să intre într-o alianță cu regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;!&lt;br /&gt;
&lt;br /&gt;
Pentru ca regatul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; să fie într-o alianță perfectă acesta trebuie să facă alianță cu toate celalate regate.&lt;br /&gt;
&lt;br /&gt;
Atenție, în formarea unei alianțe nu se iau în considerare punctele de frontieră construite în formarea altor alianțe. Cu alte cuvinte, &amp;lt;code&amp;gt;Cost(X, Y)&amp;lt;/code&amp;gt; se calculează independent pentru fiecare pereche &amp;lt;code&amp;gt;(X, Y)&amp;lt;/code&amp;gt;!&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Pentru fiecare regat trebuie să calculați costul pe care acesta trebuie să-l plătească pentru a fi într-o alianță perfectă. Cu alte cuvinte, pentru fiecare regat &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;, trebuie să calculați .&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fișierului de intrare &amp;lt;code&amp;gt;regate.in&amp;lt;/code&amp;gt; se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, numărul de regate, respectiv, numărul de muchii bidirecționale. Pe a doua linie se găsesc numerele &amp;lt;code&amp;gt;r[1]&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;r[N]&amp;lt;/code&amp;gt;, separate prin spații, unde &amp;lt;code&amp;gt;r[i]&amp;lt;/code&amp;gt; reprezintă costul construcției unui punct de frontieră la intrarea regatului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află câte trei numere naturale &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b[i]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt;, separate prin spații, &amp;lt;code&amp;gt;1 ≤ i ≤ M&amp;lt;/code&amp;gt;, semnificând că există o muchie bidirecțională între regatul &amp;lt;code&amp;gt;a[i]&amp;lt;/code&amp;gt; și regatul &amp;lt;code&amp;gt;b[i]&amp;lt;/code&amp;gt;, iar &amp;lt;code&amp;gt;c[i]&amp;lt;/code&amp;gt; reprezintă costul construcției unui punct de frontieră pe muchia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul de ieșire &amp;lt;code&amp;gt;regate.out&amp;lt;/code&amp;gt; se vor afișa &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii. Fiecare linie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; va conține un singur număr întreg, reprezentând costul ce trebuie plătit pentru ca regatul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; să fie într-o alianță perfectă, cu alte cuvinte, .&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ c[i]≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ r[i] ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a[i], b[i] ≤ N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;a[i] ≠ b[i]&amp;lt;/code&amp;gt; (adică nu există muchie de la un regat la el insuși)&lt;br /&gt;
* Între două regate poate exista cel mult o muchie&lt;br /&gt;
* Datorită dimensiunilor foarte mari, doar o parte din teste au putut fi folosite.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;regate.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5&lt;br /&gt;
 8 13 9 7 12&lt;br /&gt;
 1 2 10&lt;br /&gt;
 2 3 10&lt;br /&gt;
 3 4 10&lt;br /&gt;
 4 5 10&lt;br /&gt;
 1 3 10&lt;br /&gt;
&amp;lt;code&amp;gt;regate.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 32&lt;br /&gt;
 46&lt;br /&gt;
 36&lt;br /&gt;
 28&lt;br /&gt;
 40&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
De exemplu, pentru regatul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; avem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Cost(2, 1) = 13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Cost(2, 3) = 13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Cost(2, 4) = 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Cost(2, 5) = 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suma acestora este &amp;lt;code&amp;gt;46&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Atenție că, de exemplu, în calculul lui &amp;lt;code&amp;gt;Cost(2, 1)&amp;lt;/code&amp;gt;, nu putem pune un punct de frontieră pe muchia &amp;lt;code&amp;gt;(1 ,2)&amp;lt;/code&amp;gt; de cost &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, deoarece există drumul &amp;lt;code&amp;gt;2 → 3 → 1&amp;lt;/code&amp;gt; care nu trece prin muchia &amp;lt;code&amp;gt;(1, 2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
class Graph:&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        self.n = n&lt;br /&gt;
        self.adj_list = [[] for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    def add_edge(self, u, v, w):&lt;br /&gt;
        self.adj_list[u].append((v, w))&lt;br /&gt;
        self.adj_list[v].append((u, w))&lt;br /&gt;
&lt;br /&gt;
    def dijkstra(self, src):&lt;br /&gt;
        dist = [float(&#039;inf&#039;)] * self.n&lt;br /&gt;
        dist[src] = 0&lt;br /&gt;
        pq = [(0, src)]&lt;br /&gt;
&lt;br /&gt;
        while pq:&lt;br /&gt;
            cost, node = heapq.heappop(pq)&lt;br /&gt;
            if cost &amp;gt; dist[node]:&lt;br /&gt;
                continue&lt;br /&gt;
            for neighbor, edge_cost in self.adj_list[node]:&lt;br /&gt;
                new_cost = cost + edge_cost&lt;br /&gt;
                if new_cost &amp;lt; dist[neighbor]:&lt;br /&gt;
                    dist[neighbor] = new_cost&lt;br /&gt;
                    heapq.heappush(pq, (new_cost, neighbor))&lt;br /&gt;
        return dist&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citire date de intrare&lt;br /&gt;
    with open(&amp;quot;regate.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        r = list(map(int, fin.readline().split()))&lt;br /&gt;
        graph = Graph(N)&lt;br /&gt;
        for _ in range(M):&lt;br /&gt;
            a, b, c = map(int, fin.readline().split())&lt;br /&gt;
            graph.add_edge(a - 1, b - 1, c)&lt;br /&gt;
&lt;br /&gt;
    # Calcul costuri minime pentru fiecare regat&lt;br /&gt;
    total_costs = []&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        dist = graph.dijkstra(i)&lt;br /&gt;
        total_cost = 0&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            if i != j:&lt;br /&gt;
                min_edge_cost = min(edge_cost for neighbor, edge_cost in graph.adj_list[j])&lt;br /&gt;
                total_cost += min(dist[j], r[j], min_edge_cost)&lt;br /&gt;
        total_costs.append(total_cost)&lt;br /&gt;
&lt;br /&gt;
    # Scriere rezultate&lt;br /&gt;
    with open(&amp;quot;regate.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for cost in total_costs:&lt;br /&gt;
            fout.write(str(cost) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3446_-_Ateleport&amp;diff=10087</id>
		<title>3446 - Ateleport</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3446_-_Ateleport&amp;diff=10087"/>
		<updated>2024-06-04T03:15:45Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Marian se află în galaxia OJI-2020 și este anul 11235. În această galaxie există &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; planete diferite și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; canale bidirecţionale de transport de tipul &amp;lt;code&amp;gt;(x, y, t)&amp;lt;/code&amp;gt; care îţi permit să te deplasezi de pe planeta &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; pe planeta &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (sau invers) în &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; secunde.  Dar Marian este un adevărat inginer și, pentru că i se pare foarte ineficientă această metodă de transport, a dezvoltat un dispozitiv ca...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Marian se află în galaxia OJI-2020 și este anul 11235. În această galaxie există &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; planete diferite și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; canale bidirecţionale de transport de tipul &amp;lt;code&amp;gt;(x, y, t)&amp;lt;/code&amp;gt; care îţi permit să te deplasezi de pe planeta &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; pe planeta &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (sau invers) în &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; secunde.&lt;br /&gt;
&lt;br /&gt;
Dar Marian este un adevărat inginer și, pentru că i se pare foarte ineficientă această metodă de transport, a dezvoltat un dispozitiv care îți permite teleportarea de pe o planetă &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; pe orice altă planetă &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; secunde cu condiţia că ai putea ajunge pornind de pe planeta &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; pe planeta &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; folosind maxim &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; canale de transport.&lt;br /&gt;
&lt;br /&gt;
Acest dispozitiv este momentan doar un prototip, așa că nu îl poate folosi mai mult de &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; ori. Marian se află pe planeta &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și te roagă să îi spui care e timpul minim necesar pentru a ajunge pe planeta &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se scrie un program care calculează timpul minim necesar pentru a ajunge pe planeta &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; pornind de pe planeta &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;ateleport.in&amp;lt;/code&amp;gt; conține pe prima linie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; valori &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, separate printr-un singur spaţiu, cu semnificaţia din enunţ.&lt;br /&gt;
&lt;br /&gt;
Pe fiecare din următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se vor afla câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; valori &amp;lt;code&amp;gt;Xi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Yi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Ti&amp;lt;/code&amp;gt; care descriu un canal de transport.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;ateleport.out&amp;lt;/code&amp;gt; va conține o singură valoare pe prima linie care reprezintă&lt;br /&gt;
&lt;br /&gt;
timpul minim necesar pentru a ajunge pe planeta &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; pornind de pe planeta &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; N, M ≤ 10 000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ L, K ≤ 10&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; Ti&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;, P ≤ 100 000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; Xi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;, Yi ≤ N&amp;lt;/code&amp;gt;;&lt;br /&gt;
* între oricare două planete există cel mult un canal;&lt;br /&gt;
* pentru teste în valoare de 30 de puncte se garantează că &amp;lt;code&amp;gt;K = 0&amp;lt;/code&amp;gt; și toate canalele de comunicare au &amp;lt;code&amp;gt;Ti = 1&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pentru ALTE teste în valoare de 20 de puncte se garantează că &amp;lt;code&amp;gt;K = 0&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pentru ALTE teste în valoare de 20 de puncte se garantează că &amp;lt;code&amp;gt;N ≤ 300&amp;lt;/code&amp;gt;;&lt;br /&gt;
* se garantează că pentru toate testele există soluţie;&lt;br /&gt;
* în concurs s-au acordat 10 puncte din oficiu. Pe site se acordă 10 puncte pentru exemple.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;ateleport.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7 3 2 1&lt;br /&gt;
 1 2 2&lt;br /&gt;
 1 3 5&lt;br /&gt;
 2 3 4&lt;br /&gt;
 2 4 23&lt;br /&gt;
 3 4 6&lt;br /&gt;
 5 4 7&lt;br /&gt;
 5 6 9&lt;br /&gt;
&amp;lt;code&amp;gt;ateleport.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 14&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Dispozitivul se poate folosi cel mult o dată. Pentru a ajunge pe planeta &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; în timp minim vom parcurge canalul &amp;lt;code&amp;gt;1 → 2&amp;lt;/code&amp;gt; apoi ne vom teleporta până pe planeta &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; de unde vom mai parcurge canalul &amp;lt;code&amp;gt;5 → 6&amp;lt;/code&amp;gt;. Costul final este &amp;lt;code&amp;gt;2 + 3&amp;lt;/code&amp;gt;(teleportare)  &amp;lt;code&amp;gt;+ 9 = 14&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;ateleport.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7 3 2 0&lt;br /&gt;
 1 2 2&lt;br /&gt;
 1 3 5&lt;br /&gt;
 2 3 4&lt;br /&gt;
 2 4 23&lt;br /&gt;
 3 4 6&lt;br /&gt;
 5 4 7&lt;br /&gt;
 5 6 9&lt;br /&gt;
&amp;lt;code&amp;gt;ateleport.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 27&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Dispozitivul nu se poate folosi deloc. Pentru a ajunge pe planeta &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; de pe planeta &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în timp minim, se vor parcurge canalele în ordinea &amp;lt;code&amp;gt;1→3→4→5→6&amp;lt;/code&amp;gt; și se obține timpul &amp;lt;code&amp;gt;5+6+7+9=27&amp;lt;/code&amp;gt; de secunde.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
fin = open(&amp;quot;ateleport.in&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
fout = open(&amp;quot;ateleport.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
NMAX = 10001&lt;br /&gt;
TMAX = 11&lt;br /&gt;
&lt;br /&gt;
class Muchie:&lt;br /&gt;
    def __init__(self, to, cost):&lt;br /&gt;
        self.to = to&lt;br /&gt;
        self.cost = cost&lt;br /&gt;
&lt;br /&gt;
muchii = [[] for _ in range(NMAX)]&lt;br /&gt;
timp = [[[float(&#039;inf&#039;) for _ in range(TMAX)] for _ in range(TMAX)] for _ in range(NMAX)]&lt;br /&gt;
&lt;br /&gt;
def ini(n):&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(11):&lt;br /&gt;
            for k in range(11):&lt;br /&gt;
                timp[i][j][k] = float(&#039;inf&#039;)&lt;br /&gt;
&lt;br /&gt;
class Element:&lt;br /&gt;
    def __init__(self, nod, tp, p):&lt;br /&gt;
        self.nod = nod&lt;br /&gt;
        self.tp = tp&lt;br /&gt;
        self.p = p&lt;br /&gt;
&lt;br /&gt;
    def __lt__(self, other):&lt;br /&gt;
        return timp[other.nod][other.tp][other.p] &amp;lt; timp[self.nod][self.tp][self.p]&lt;br /&gt;
&lt;br /&gt;
def dijkstra(destinatie, l, k, p):&lt;br /&gt;
    timp[1][0][0] = 0&lt;br /&gt;
    pq = []&lt;br /&gt;
    heapq.heappush(pq, Element(1, 0, 0))&lt;br /&gt;
&lt;br /&gt;
    while pq:&lt;br /&gt;
        relax = heapq.heappop(pq)&lt;br /&gt;
&lt;br /&gt;
        for it in muchii[relax.nod]:&lt;br /&gt;
            # nu ma teleportez&lt;br /&gt;
            if timp[it.to][relax.tp][0] &amp;gt; timp[relax.nod][relax.tp][relax.p] + it.cost:&lt;br /&gt;
                timp[it.to][relax.tp][0] = timp[relax.nod][relax.tp][relax.p] + it.cost&lt;br /&gt;
                heapq.heappush(pq, Element(it.to, relax.tp, 0))&lt;br /&gt;
&lt;br /&gt;
            # incep o teleportare&lt;br /&gt;
            if relax.tp &amp;lt; k:&lt;br /&gt;
                if timp[it.to][relax.tp + 1][1] &amp;gt; timp[relax.nod][relax.tp][relax.p] + p:&lt;br /&gt;
                    timp[it.to][relax.tp + 1][1] = timp[relax.nod][relax.tp][relax.p] + p&lt;br /&gt;
                    heapq.heappush(pq, Element(it.to, relax.tp + 1, 1))&lt;br /&gt;
&lt;br /&gt;
            # continui o teleportare&lt;br /&gt;
            if relax.p and relax.p &amp;lt; l:&lt;br /&gt;
                if timp[it.to][relax.tp][relax.p + 1] &amp;gt; timp[relax.nod][relax.tp][relax.p]:&lt;br /&gt;
                    timp[it.to][relax.tp][relax.p + 1] = timp[relax.nod][relax.tp][relax.p]&lt;br /&gt;
                    heapq.heappush(pq, Element(it.to, relax.tp, relax.p + 1))&lt;br /&gt;
&lt;br /&gt;
    ans = float(&#039;inf&#039;)&lt;br /&gt;
    for j in range(k + 1):&lt;br /&gt;
        for m in range(l + 1):&lt;br /&gt;
            ans = min(ans, timp[destinatie][j][m])&lt;br /&gt;
&lt;br /&gt;
    fout.write(str(ans) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n, m, p, l, k = map(int, fin.readline().split())&lt;br /&gt;
    ini(n)&lt;br /&gt;
&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        a, b, c = map(int, fin.readline().split())&lt;br /&gt;
        muchii[a].append(Muchie(b, c))&lt;br /&gt;
        muchii[b].append(Muchie(a, c))&lt;br /&gt;
&lt;br /&gt;
    dijkstra(n, l, k, p)&lt;br /&gt;
&lt;br /&gt;
    fin.close()&lt;br /&gt;
    fout.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3325_-_Ohoo&amp;diff=10086</id>
		<title>3325 - Ohoo</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3325_-_Ohoo&amp;diff=10086"/>
		<updated>2024-06-04T03:09:54Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: == Cerinta == Porumbeii au pornit un război crâncen împotriva ciorilor, dar ele au construit garduri defensive pe toate rutele pe care le-ar putea folosi armata porumbeilor pentru a le ataca cetatea. Pentru a ajunge la cetatea ciorilor armata trebuie sa treacă de gardurile construite de ciori.  Pentru că porumbeii obosesc din cauza zborului ei trebuie sa se odihneasca pe statui, astfel armata poate merge doar pe drumurile cunoscute dintre două statui. Există n statui,...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinta ==&lt;br /&gt;
Porumbeii au pornit un război crâncen împotriva ciorilor, dar ele au construit garduri defensive pe toate rutele pe care le-ar putea folosi armata porumbeilor pentru a le ataca cetatea. Pentru a ajunge la cetatea ciorilor armata trebuie sa treacă de gardurile construite de ciori.&lt;br /&gt;
&lt;br /&gt;
Pentru că porumbeii obosesc din cauza zborului ei trebuie sa se odihneasca pe statui, astfel armata poate merge doar pe drumurile cunoscute dintre două statui. Există n statui, iar armata se află inițial pe statuia cu numărul 1, iar cetatea ciorilor se va afla pe cea cu numărul n.&lt;br /&gt;
&lt;br /&gt;
Armata porumbeilor deține un cioc bionic de putere K. Acesta poate sparge garduri cu rezistență mai mica sau egala cu K, armata putând astfel să treacă pe acel drum.&lt;br /&gt;
&lt;br /&gt;
Generalul armatei porumbeilor vă cere să găsiți puterea minimă pe care o poate avea ciocul bionic pentru ca armata să poată ajunge la cetatea ciorilor&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare Ohoo.in va conține: Pe prima linie numărul natural n reprezentând numărul de statui și numărul natural m reprezentând numărul de drumuri existente între statui. Pe următoarele m linii se vor găsi câte 3 numere: x, y, r, cu semnificația că există un drum bidirecțional între statuile x și y blocat de un gard de rezistență r.&lt;br /&gt;
&lt;br /&gt;
== Date de iesire ==&lt;br /&gt;
Fișierul de ieșire Ohoo.out va conține un singur număr natural K, reprezentând puterea minimă pe care o poate avea ciocul bionic astfel încât armata să poată ajunge la cetatea ciorilor.&lt;br /&gt;
&lt;br /&gt;
== Restrictii si precizari: ==&lt;br /&gt;
2 ≤ n ≤ 100.000&lt;br /&gt;
&lt;br /&gt;
1 ≤ m ≤ 250.000&lt;br /&gt;
&lt;br /&gt;
Rezistențele gardurilor sunt numere naturale nenule și nu depășesc 1.000.000&lt;br /&gt;
&lt;br /&gt;
Între două statui pot exista mai multe drumuri cu garduri de rezistențe diferite&lt;br /&gt;
&lt;br /&gt;
Întotdeauna există soluție&lt;br /&gt;
&lt;br /&gt;
Pentru 60% din teste n ≤ 1000 și K ≤ 1000&lt;br /&gt;
&lt;br /&gt;
Se acordă 10 puncte pentru exemplu&lt;br /&gt;
&lt;br /&gt;
Atenție la numele fișirelor de intrare și de ieșire!&lt;br /&gt;
&lt;br /&gt;
== Exemplu ==&lt;br /&gt;
Ohoo.in&lt;br /&gt;
&lt;br /&gt;
5 6&lt;br /&gt;
&lt;br /&gt;
1 2 3&lt;br /&gt;
&lt;br /&gt;
1 4 1&lt;br /&gt;
&lt;br /&gt;
2 3 2&lt;br /&gt;
&lt;br /&gt;
3 5 3&lt;br /&gt;
&lt;br /&gt;
4 5 4&lt;br /&gt;
&lt;br /&gt;
3 4 4&lt;br /&gt;
&lt;br /&gt;
Ohoo.out&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Alegem drumul &amp;lt;code&amp;gt;1-2-3-5&amp;lt;/code&amp;gt; folosind o putere maximă de &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
&lt;br /&gt;
def dfs(node, d):&lt;br /&gt;
    global t&lt;br /&gt;
    if node == n:&lt;br /&gt;
        t = True&lt;br /&gt;
    else:&lt;br /&gt;
        vis[node] = True&lt;br /&gt;
        for i, c in graph[node]:&lt;br /&gt;
            if not t and c &amp;lt;= d and not vis[i]:&lt;br /&gt;
                dfs(i, d)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global n, m, vis, t, graph&lt;br /&gt;
    with open(&amp;quot;Ohoo.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        graph = defaultdict(list)&lt;br /&gt;
        mz = 0&lt;br /&gt;
&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y, c = map(int, fin.readline().split())&lt;br /&gt;
            graph[x].append((y, c))&lt;br /&gt;
            graph[y].append((x, c))&lt;br /&gt;
            mz = max(mz, c)&lt;br /&gt;
&lt;br /&gt;
    st, dr, sol = 1, mz, mz&lt;br /&gt;
    while st &amp;lt;= dr:&lt;br /&gt;
        mij = (st + dr) // 2&lt;br /&gt;
        vis = [False] * (n + 1)&lt;br /&gt;
        t = False&lt;br /&gt;
        dfs(1, mij)&lt;br /&gt;
        if t:&lt;br /&gt;
            sol = mij&lt;br /&gt;
            dr = mij - 1&lt;br /&gt;
        else:&lt;br /&gt;
            st = mij + 1&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;Ohoo.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(sol) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3061_-_oracol&amp;diff=10085</id>
		<title>3061 - oracol</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3061_-_oracol&amp;diff=10085"/>
		<updated>2024-06-04T03:04:00Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Gustavo, după ce a realizat că posedă abilitatea de a vedea în viitor, a decis că a venit momentul să treacă la următorul nivel și să-și valorifice capacitățile extrasenzoriale. Pentru a câștiga prestigiu și a deveni mai cunoscut în rândurile magicienilor profesioniști, acesta a ales să debuteze la Olimpiada Națională de Informatică prin prezicerea datelor de intrare pentru anumite probleme propuse în concurs. Primul client al lui Gustavo, Alfredo, ar...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gustavo, după ce a realizat că posedă abilitatea de a vedea în viitor, a decis că a venit momentul să treacă la următorul nivel și să-și valorifice capacitățile extrasenzoriale. Pentru a câștiga prestigiu și a deveni mai cunoscut în rândurile magicienilor profesioniști, acesta a ales să debuteze la Olimpiada Națională de Informatică prin prezicerea datelor de intrare pentru anumite probleme propuse în concurs. Primul client al lui Gustavo, Alfredo, ar dori să afle într-un mod inedit conținutul unui fișier de intrare aferent unei probleme de concurs, în care sunt scrise elementele unui șir &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi. Pentru a face lucrurile mai interesante, Gustavo îi percepe o taxă de &amp;lt;code&amp;gt;C(i,j)&amp;lt;/code&amp;gt; bănuți pentru a-i divulga suma numerelor din șirul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; cu indici în intervalul &amp;lt;code&amp;gt;[i, j]&amp;lt;/code&amp;gt;, anume &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;+ pi+1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;+ ... + pj&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Dându-se valoarea lui &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și toate valorile &amp;lt;code&amp;gt;C(i,j)&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;1 ≤ i ≤ j ≤ N&amp;lt;/code&amp;gt;, determinați costul total minim pe care trebuie să-l plătească Alfredo pentru a afla toate elementele șirului &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
În fișierul &amp;lt;code&amp;gt;oracol.in&amp;lt;/code&amp;gt; se află pe prima linie numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află taxele percepute de Gustavo astfel: pe linia &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; se vor afla &amp;lt;code&amp;gt;N-i+1&amp;lt;/code&amp;gt; numere naturale separate prin câte un spațiu, reprezentând în ordine costurile &amp;lt;code&amp;gt;C(i,i)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C(i,i+1)&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;C(i,N)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;oracol.out&amp;lt;/code&amp;gt; va conține pe prima linie un singur număr care reprezintă costul total minim pe care trebuie să-l plătească Alfredo pentru a afla șirul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 1000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pentru orice &amp;lt;code&amp;gt;1 ≤ i ≤ j ≤ N&amp;lt;/code&amp;gt; se garantează &amp;lt;code&amp;gt;0 ≤ C(i,j) ≤ 1.000.000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pentru teste în valoare de &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; puncte &amp;lt;code&amp;gt;1 ≤ N ≤ 250&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;oracol.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 4 5 1&lt;br /&gt;
 6 3&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;code&amp;gt;oracol.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Costul total minim este &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; și se obține astfel:&lt;br /&gt;
&lt;br /&gt;
Cu un cost de valoare &amp;lt;code&amp;gt;C(1,3) = 1&amp;lt;/code&amp;gt; putem afla suma &amp;lt;code&amp;gt;p1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;+ p2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;+ p3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Cu un cost de valoare &amp;lt;code&amp;gt;C(3,3) = 2&amp;lt;/code&amp;gt; putem afla valoarea lui &amp;lt;code&amp;gt;p3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Cu un cost de valoare &amp;lt;code&amp;gt;C(2,3) = 3&amp;lt;/code&amp;gt; putem afla suma &amp;lt;code&amp;gt;p2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;+ p3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Din acestea putem afla exact toate elementele șirului &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
class DSU:&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        self.f = list(range(n))&lt;br /&gt;
&lt;br /&gt;
    def find(self, x):&lt;br /&gt;
        if self.f[x] != x:&lt;br /&gt;
            self.f[x] = self.find(self.f[x])&lt;br /&gt;
        return self.f[x]&lt;br /&gt;
&lt;br /&gt;
    def union(self, x, y):&lt;br /&gt;
        self.f[self.find(x)] = self.find(y)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;oracol.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        costs = []&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            row = list(map(int, fin.readline().split()))&lt;br /&gt;
            costs.extend(row)&lt;br /&gt;
&lt;br /&gt;
    edges = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i + 1, n + 1):&lt;br /&gt;
            cost = costs.pop(0)&lt;br /&gt;
            edges.append((i, j, cost))&lt;br /&gt;
    &lt;br /&gt;
    edges.sort(key=lambda x: x[2])&lt;br /&gt;
    f = DSU(n + 1)&lt;br /&gt;
    ans = 0&lt;br /&gt;
    for e in edges:&lt;br /&gt;
        if f.find(e[0]) != f.find(e[1]):&lt;br /&gt;
            ans += e[2]&lt;br /&gt;
            f.union(e[0], e[1])&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;oracol.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(ans) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2933_-_TollRoads&amp;diff=10084</id>
		<title>2933 - TollRoads</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2933_-_TollRoads&amp;diff=10084"/>
		<updated>2024-06-04T03:00:30Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orașe sunt conectate între ele prin &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; autostrăzi bidirecționale, fiecare autostradă &amp;lt;code&amp;gt;(a, b)&amp;lt;/code&amp;gt; având un cost de tranzit &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; atașat. Se dorește revizuirea sistemului de taxare, însă sunt câteva aspecte ce trebuie luate în calcul și necesită investigație, deoarece o parte dintre cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orașe sunt centre comerciale sau turistice importante.  Se dorește să se afle răspunsul la o serie de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
&amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orașe sunt conectate între ele prin &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; autostrăzi bidirecționale, fiecare autostradă &amp;lt;code&amp;gt;(a, b)&amp;lt;/code&amp;gt; având un cost de tranzit &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; atașat. Se dorește revizuirea sistemului de taxare, însă sunt câteva aspecte ce trebuie luate în calcul și necesită investigație, deoarece o parte dintre cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orașe sunt centre comerciale sau turistice importante.&lt;br /&gt;
&lt;br /&gt;
Se dorește să se afle răspunsul la o serie de &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; întrebări de forma: &amp;lt;code&amp;gt;(X, T)&amp;lt;/code&amp;gt; – câte dintre celelalte &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; orașe au acces către orașul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, cu o taxă totală de cel mult &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; către fiecare oraș?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;tollroads.in&amp;lt;/code&amp;gt; conține pe primul rând numerele &amp;lt;code&amp;gt;N, M și Q&amp;lt;/code&amp;gt; reprezentând numărul de orașe, numărul de autostrăzi și numărul de interogări. Pe fiecare din următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; rânduri sunt scrise câte trei numere &amp;lt;code&amp;gt;a, b, c,&amp;lt;/code&amp;gt; separate prin câte un spațiu, reprezentând două orașe între care există o autostradă și costul autostrăzii. Pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; rânduri se află scrise câte două numere &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, separate prin spațiu, reprezentând datele interogărilor, conform enunțului.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul de ieșire &amp;lt;code&amp;gt;tollroads.out&amp;lt;/code&amp;gt; se vor scrie pe fiecare dintre primele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; rânduri câte un singur număr, reprezentând răspunsurile la interogări, în ordinea în care ele au fost puse.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a, b ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ c ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ T ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* între orice două orașe poate exista mai mult de o autostrada&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;tollroads.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 8 5&lt;br /&gt;
 1 2 1&lt;br /&gt;
 2 3 2&lt;br /&gt;
 2 4 4&lt;br /&gt;
 3 5 1&lt;br /&gt;
 4 5 1&lt;br /&gt;
 5 6 2&lt;br /&gt;
 1 6 5&lt;br /&gt;
 6 7 1&lt;br /&gt;
 1 6&lt;br /&gt;
 1 5&lt;br /&gt;
 1 4&lt;br /&gt;
 2 3&lt;br /&gt;
 4 4&lt;br /&gt;
&amp;lt;code&amp;gt;tollroads.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 5&lt;br /&gt;
 3&lt;br /&gt;
 3&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Orașele &amp;lt;code&amp;gt;2,3,4,5,6,7&amp;lt;/code&amp;gt; au acces către orașul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; cu taxă maximă &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Orașele &amp;lt;code&amp;gt;2,3,4,5,6&amp;lt;/code&amp;gt; au acces către orașul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; cu taxă maximă &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Orașele &amp;lt;code&amp;gt;2,3,5&amp;lt;/code&amp;gt; au acces către orașul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; cu taxă maximă &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Orașele &amp;lt;code&amp;gt;1,3,5&amp;lt;/code&amp;gt; au acces către orașul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; cu taxă maximă &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Orașele &amp;lt;code&amp;gt;2,3,5,6,7&amp;lt;/code&amp;gt; au acces către orașul &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; cu taxă maximă &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict, deque&lt;br /&gt;
&lt;br /&gt;
INF = 2000000002&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    f = open(&amp;quot;tollroads.in&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    g = open(&amp;quot;tollroads.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    n, m, Q = map(int, f.readline().split())&lt;br /&gt;
&lt;br /&gt;
    graph = defaultdict(list)&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        x, y, c = map(int, f.readline().split())&lt;br /&gt;
        graph[x].append((y, c))&lt;br /&gt;
        graph[y].append((x, c))&lt;br /&gt;
&lt;br /&gt;
    for _ in range(Q):&lt;br /&gt;
        nod, taxa = map(int, f.readline().split())&lt;br /&gt;
        dr = [INF] * (n + 1)&lt;br /&gt;
        din = [[] for _ in range(taxa + 1)]&lt;br /&gt;
&lt;br /&gt;
        din[0].append(nod)&lt;br /&gt;
        dr[nod] = sol = 0&lt;br /&gt;
&lt;br /&gt;
        viz = [False] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
        for i in range(taxa + 1):&lt;br /&gt;
            for nod in din[i]:&lt;br /&gt;
                if viz[nod]:&lt;br /&gt;
                    continue&lt;br /&gt;
                for ve, co in graph[nod]:&lt;br /&gt;
                    if dr[nod] + co &amp;gt; taxa or viz[ve]:&lt;br /&gt;
                        continue&lt;br /&gt;
                    if dr[ve] &amp;gt; dr[nod] + co:&lt;br /&gt;
                        dr[ve] = dr[nod] + co&lt;br /&gt;
                        din[dr[ve]].append(ve)&lt;br /&gt;
                viz[nod] = True&lt;br /&gt;
            din[i] = []&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            viz[i] = False&lt;br /&gt;
            if dr[i] != INF:&lt;br /&gt;
                sol += 1&lt;br /&gt;
        &lt;br /&gt;
        g.write(str(sol - 1) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
    f.close()&lt;br /&gt;
    g.close()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2539_-_flori4&amp;diff=10083</id>
		<title>2539 - flori4</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2539_-_flori4&amp;diff=10083"/>
		<updated>2024-06-04T02:57:25Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  Compania lui Jimmy are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; plantații cu flori. Pentru fiecare plantație se cunoaște tipul florilor cultivate, respectiv câte tone de flori au fost produse anul acesta. Se cunoaște că plantațiile cu flori sunt conectate prin &amp;lt;code&amp;gt;n - 1&amp;lt;/code&amp;gt; drumuri astfel încât la fiecare plantație se poate ajunge de la oricare altă plantație și există un singur mod de ajunge de la plantația &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; la plantația &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; , pentru fiecare &amp;lt;code&amp;gt;1 ≤...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Compania lui Jimmy are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; plantații cu flori. Pentru fiecare plantație se cunoaște tipul florilor cultivate, respectiv câte tone de flori au fost produse anul acesta. Se cunoaște că plantațiile cu flori sunt conectate prin &amp;lt;code&amp;gt;n - 1&amp;lt;/code&amp;gt; drumuri astfel încât la fiecare plantație se poate ajunge de la oricare altă plantație și există un singur mod de ajunge de la plantația &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; la plantația &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; , pentru fiecare &amp;lt;code&amp;gt;1 ≤ x, y ≤ n&amp;lt;/code&amp;gt;. De asemenea, știm și distanța în km pentru fiecare dintre cele &amp;lt;code&amp;gt;n - 1&amp;lt;/code&amp;gt; drumuri.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Jimmy vrea să aducă toate florile de același tip în același loc, cu cost minim de transport. Dacă avem &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; tone de flori şi vrem să le trimitem pe o distanță de &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; kilometri, costul transportului este &amp;lt;code&amp;gt;a * b&amp;lt;/code&amp;gt;. Pentru fiecare tip de floare Jimmy vrea să determine costul minim de transport pentru a aduce toate florile de același tip la un loc.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie se va găsi numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, apoi, pe cea de-a doua linie, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere mici separate între ele prin câte un spațiu, care simbolizează tipul de floare produs pe plantația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; (fiecare tip de floare este o literă mică a alfabetului englez). Pe cea de-a treia linie se găsesc &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere întregi care reprezintă câte tone din fiecare floare au fost produse pe plantația &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;n - 1&amp;lt;/code&amp;gt; linii se găsesc trei numere naturale &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;, cu semnificația că există drum direct între plantațiile &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, iar numărul &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; reprezintă distanța de la &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Pe prima linie se afișează &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; de numere separate prin spațiu, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea număr reprezentând costul minim de transport pentru tipul de floare specificat de litera de pe poziția &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; în alfabetul englez (răspunsurile sunt în ordinea în care literele se găsesc în alfabet).&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;4 ≤ n &amp;lt; 200 001&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Fiecare dintre numerele din datele de intrare este un număr natural mai mic decât &amp;lt;code&amp;gt;200 001&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Destinaţia finală a fiecărui transport este una dintre cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; plantaţii existente.&lt;br /&gt;
* Dacă există litere care nu reprezintă codul tipului unei flori, atunci costul minim de transport pentru acel tip este &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;20%&amp;lt;/code&amp;gt; din teste, &amp;lt;code&amp;gt;n &amp;lt; 1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru alte &amp;lt;code&amp;gt;25%&amp;lt;/code&amp;gt; din teste, &amp;lt;code&amp;gt;n &amp;lt; 100 000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 4&lt;br /&gt;
 a b a b&lt;br /&gt;
 2 4 4 3&lt;br /&gt;
 1 3 4&lt;br /&gt;
 3 4 2&lt;br /&gt;
 1 2 5&lt;br /&gt;
Ieșire&lt;br /&gt;
 8 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def dijkstra(graph, start):&lt;br /&gt;
    n = len(graph)&lt;br /&gt;
    dist = [float(&#039;inf&#039;)] * n&lt;br /&gt;
    dist[start] = 0&lt;br /&gt;
    pq = [(0, start)]  # Priority queue of tuples (distance, vertex)&lt;br /&gt;
&lt;br /&gt;
    while pq:&lt;br /&gt;
        d, u = heapq.heappop(pq)&lt;br /&gt;
        if d &amp;gt; dist[u]:&lt;br /&gt;
            continue&lt;br /&gt;
        for v, w in graph[u]:&lt;br /&gt;
            if dist[u] + w &amp;lt; dist[v]:&lt;br /&gt;
                dist[v] = dist[u] + w&lt;br /&gt;
                heapq.heappush(pq, (dist[v], v))&lt;br /&gt;
&lt;br /&gt;
    return dist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_transport_cost(types, quantities, distances):&lt;br /&gt;
    n = len(types)&lt;br /&gt;
    types_cost = [0] * 26&lt;br /&gt;
&lt;br /&gt;
    for t in range(26):&lt;br /&gt;
        nodes = {i for i in range(n) if ord(types[i]) - ord(&#039;a&#039;) == t}&lt;br /&gt;
        if not nodes:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        dist = dijkstra(distances, next(iter(nodes)))  # Selectăm primul nod din set&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            if ord(types[i]) - ord(&#039;a&#039;) == t:&lt;br /&gt;
                types_cost[t] += quantities[i] * dist[i]&lt;br /&gt;
&lt;br /&gt;
    return types_cost&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
types = input().split()&lt;br /&gt;
quantities = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
distances = [[] for _ in range(n)]&lt;br /&gt;
for _ in range(n - 1):&lt;br /&gt;
    x, y, d = map(int, input().split())&lt;br /&gt;
    distances[x - 1].append((y - 1, d))&lt;br /&gt;
    distances[y - 1].append((x - 1, d))&lt;br /&gt;
&lt;br /&gt;
result = calculate_transport_cost(types, quantities, distances)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(*result)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4244_-_urgenta&amp;diff=10082</id>
		<title>4244 - urgenta</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4244_-_urgenta&amp;diff=10082"/>
		<updated>2024-06-04T02:43:09Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  Autorităţile dintr-o zonă de munte intenţionează să stabilească un plan de urgenţă, pentru a reacţiona mai eficient la frecventele calamităţi naturale din zonă. În acest scop au identificat &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; puncte de interes strategic şi le-au numerotat distinct de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Punctele de interes strategic sunt conectate prin &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; căi de acces având priorităţi în funcţie de importanţă. Între oricare două puncte de int...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Autorităţile dintr-o zonă de munte intenţionează să stabilească un plan de urgenţă, pentru a reacţiona mai eficient la frecventele calamităţi naturale din zonă. În acest scop au identificat &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; puncte de interes strategic şi le-au numerotat distinct de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;. Punctele de interes strategic sunt conectate prin &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; căi de acces având priorităţi în funcţie de importanţă. Între oricare două puncte de interes strategic există cel mult o cale de acces ce poate fi parcursă în ambele sensuri şi cel puţin un drum (format din una sau mai multe căi de acces) ce le conectează.&lt;br /&gt;
&lt;br /&gt;
În cazul unei calamităţi unele căi de acces pot fi temporar întrerupte şi astfel între anumite puncte de interes nu mai există legătură. Ca urmare pot rezulta mai multe grupuri de puncte în aşa fel încât între oricare două puncte din acelaşi grup să existe măcar un drum şi între oricare două puncte din grupuri diferite să nu existe drum.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Autorităţile estimează gravitatea unei calamităţi ca fiind suma priorităţilor căilor de acces distruse de aceasta şi doresc să determine un scenariu de gravitate maximă, în care punctele de interes strategic să fie împărţite într-un număr de &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; grupuri.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;urgenta.in&amp;lt;/code&amp;gt; are următorul format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;N M K&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;i1 j1 p1&amp;lt;/code&amp;gt; – între punctele &amp;lt;code&amp;gt;i1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;j1&amp;lt;/code&amp;gt; există o cale de acces de prioritate &amp;lt;code&amp;gt;p1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;i2 j2 p2&amp;lt;/code&amp;gt; – între punctele &amp;lt;code&amp;gt;i2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;j2&amp;lt;/code&amp;gt; există o cale de acces de prioritate &amp;lt;code&amp;gt;p2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iM jM pM&amp;lt;/code&amp;gt; – între punctele &amp;lt;code&amp;gt;iM&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;jM&amp;lt;/code&amp;gt; există o cale de acces de prioritate &amp;lt;code&amp;gt;pM&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;urgenta.out&amp;lt;/code&amp;gt; va avea următorul format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;gravmax&amp;lt;/code&amp;gt; – gravitatea maximă&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; – numărul de căi de acces întrerupte de calamitate&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;k1 h1&amp;lt;/code&amp;gt; – între punctele &amp;lt;code&amp;gt;k1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;h1&amp;lt;/code&amp;gt; a fost întreruptă calea de acces&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;k2 h2&amp;lt;/code&amp;gt; – între punctele &amp;lt;code&amp;gt;k2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;h2&amp;lt;/code&amp;gt; a fost întreruptă calea de acces&lt;br /&gt;
&lt;br /&gt;
…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;kC hC&amp;lt;/code&amp;gt; – între punctele &amp;lt;code&amp;gt;kC&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;hC&amp;lt;/code&amp;gt; a fost întreruptă calea de acces&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; N &amp;lt; 256&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;N - 2 &amp;lt; M &amp;lt; 32385&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; K &amp;lt; N + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Priorităţile căilor de acces sunt întregi strict pozitivi mai mici decât &amp;lt;code&amp;gt;256&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Un grup de puncte poate conţine între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; puncte inclusiv.&lt;br /&gt;
* Dacă există mai multe soluţii, programul va determina una singură.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;urgenta.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 11 4&lt;br /&gt;
 1 2 1&lt;br /&gt;
 1 3 2&lt;br /&gt;
 1 7 3&lt;br /&gt;
 2 4 3&lt;br /&gt;
 3 4 2&lt;br /&gt;
 3 5 1&lt;br /&gt;
 3 6 1&lt;br /&gt;
 3 7 5&lt;br /&gt;
 4 5 5&lt;br /&gt;
 5 6 4&lt;br /&gt;
 6 7 3&lt;br /&gt;
&amp;lt;code&amp;gt;urgenta.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 27&lt;br /&gt;
 8&lt;br /&gt;
 1 3&lt;br /&gt;
 1 7&lt;br /&gt;
 2 4&lt;br /&gt;
 3 4&lt;br /&gt;
 3 7&lt;br /&gt;
 4 5&lt;br /&gt;
 5 6&lt;br /&gt;
 6 7&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
class UnionFind:&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        self.parent = [i for i in range(n + 1)]&lt;br /&gt;
        self.rank = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    def find(self, x):&lt;br /&gt;
        if self.parent[x] != x:&lt;br /&gt;
            self.parent[x] = self.find(self.parent[x])&lt;br /&gt;
        return self.parent[x]&lt;br /&gt;
&lt;br /&gt;
    def union(self, x, y):&lt;br /&gt;
        root_x = self.find(x)&lt;br /&gt;
        root_y = self.find(y)&lt;br /&gt;
        if root_x != root_y:&lt;br /&gt;
            if self.rank[root_x] &amp;gt; self.rank[root_y]:&lt;br /&gt;
                self.parent[root_y] = root_x&lt;br /&gt;
            elif self.rank[root_x] &amp;lt; self.rank[root_y]:&lt;br /&gt;
                self.parent[root_x] = root_y&lt;br /&gt;
            else:&lt;br /&gt;
                self.parent[root_y] = root_x&lt;br /&gt;
                self.rank[root_x] += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    nMAX = 255&lt;br /&gt;
    fin = open(&amp;quot;urgenta.in&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    fout = open(&amp;quot;urgenta.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    n, m, k = map(int, fin.readline().split())&lt;br /&gt;
    edges = []&lt;br /&gt;
    edges_fol = [False] * (m + 1)&lt;br /&gt;
    tat = [0] * (nMAX + 1)&lt;br /&gt;
    niv = [0] * (nMAX + 1)&lt;br /&gt;
    grupe, edgfol = n, 0&lt;br /&gt;
    costall, costfol = 0, 0&lt;br /&gt;
&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        a, b, c = map(int, fin.readline().split())&lt;br /&gt;
        costall += c&lt;br /&gt;
        edges.append((c, a, b))&lt;br /&gt;
&lt;br /&gt;
    edges.sort()&lt;br /&gt;
&lt;br /&gt;
    def rad(nod):&lt;br /&gt;
        if tat[nod]:&lt;br /&gt;
            return rad(tat[nod])&lt;br /&gt;
        return nod&lt;br /&gt;
&lt;br /&gt;
    def changeDads(nod, newdad):&lt;br /&gt;
        if tat[nod]:&lt;br /&gt;
            changeDads(tat[nod], newdad)&lt;br /&gt;
        tat[nod] = newdad&lt;br /&gt;
&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        if grupe == k:&lt;br /&gt;
            break&lt;br /&gt;
        c, a, b = edges[i]&lt;br /&gt;
        rada = rad(a)&lt;br /&gt;
        radb = rad(b)&lt;br /&gt;
&lt;br /&gt;
        if rada != radb:&lt;br /&gt;
            if niv[rada] &amp;lt; niv[radb]:&lt;br /&gt;
                changeDads(a, radb)&lt;br /&gt;
            elif niv[rada] &amp;gt; niv[radb]:&lt;br /&gt;
                changeDads(b, rada)&lt;br /&gt;
            else:&lt;br /&gt;
                niv[rada] += 1&lt;br /&gt;
                changeDads(b, rada)&lt;br /&gt;
            &lt;br /&gt;
            edges_fol[i] = True&lt;br /&gt;
            edgfol += 1&lt;br /&gt;
            costfol += c&lt;br /&gt;
            grupe -= 1&lt;br /&gt;
&lt;br /&gt;
    fout.write(str(costall - costfol) + &#039;\n&#039;)&lt;br /&gt;
    fout.write(str(m - edgfol) + &#039;\n&#039;)&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        if not edges_fol[i]:&lt;br /&gt;
            fout.write(str(edges[i][1]) + &#039; &#039; + str(edges[i][2]) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
    fin.close()&lt;br /&gt;
    fout.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1974_-_TrumpLandia&amp;diff=10081</id>
		<title>1974 - TrumpLandia</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1974_-_TrumpLandia&amp;diff=10081"/>
		<updated>2024-06-04T02:29:34Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  După o confruntare eroică, Trump a fost ales democratic președintele unei republici prospere, &amp;#039;&amp;#039;TrumpLandia&amp;#039;&amp;#039;. Natural, prima sa prioritate e să construiască o rețea de buncăre, pentru a veni în întâmpinarea unui atac al vecinilor imperaliști.  &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; buncăre au fost deja construite. Trump trebuie să aleagă între &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; posibile rute bidirecționale pentru a le conecta. Un plan de conectare este alcătuit dintr-un subset minim de astfel de leg...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
După o confruntare eroică, Trump a fost ales democratic președintele unei republici prospere, &#039;&#039;TrumpLandia&#039;&#039;. Natural, prima sa prioritate e să construiască o rețea de buncăre, pentru a veni în întâmpinarea unui atac al vecinilor imperaliști.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; buncăre au fost deja construite. Trump trebuie să aleagă între &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; posibile rute bidirecționale pentru a le conecta. Un plan de conectare este alcătuit dintr-un subset minim de astfel de legături, astfel încât din fiecare locație să se poată ajunge în orice altă locație. Costul unui plan este dat de suma distanțelor legăturilor.&lt;br /&gt;
&lt;br /&gt;
Deoarece rutele sunt vulnerabile la bombardamente aeriene, Trump vă cere să estimați un plan de cost minim. În plus, Trump vă cere să calculați &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; soluții de rezervă, pentru situația în care una dintre cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; legături este sigur inclusă în plan.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Datele de intrare vor fi citite din fișierul &amp;lt;code&amp;gt;trumplandia.in&amp;lt;/code&amp;gt;. Pe prima linie se află trei numere separate prin spațiu: &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (numărul de buncăre), &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; (numărul de rute posibile), &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; (numărul de soluții de rezervă).&lt;br /&gt;
&lt;br /&gt;
Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află triplete de forma (&amp;lt;code&amp;gt;nod1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nod2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dist12&amp;lt;/code&amp;gt;) ce descriu o posibilă legătură între nodurile &amp;lt;code&amp;gt;nod1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;nod2&amp;lt;/code&amp;gt; cu distanța &amp;lt;code&amp;gt;dist12&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii se află câte un număr &amp;lt;code&amp;gt;Qi&amp;lt;/code&amp;gt;, reprezentând indexul unei muchii care trebuie inclusă într-un plan de rezervă. (valorile se pot repeta)&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Datele de ieșire vor fi afișate în fișierul &amp;lt;code&amp;gt;trumplandia.out&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe prima linie se va afla un număr reprezentând costul celui mai bun plan, pentru situația în care pot fi folosite oricare dintre cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; rute.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii se află un număr &amp;lt;code&amp;gt;Ci&amp;lt;/code&amp;gt; reprezentând costul minim al unui plan care conține muchia &amp;lt;code&amp;gt;Qi&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 200.000&amp;lt;/code&amp;gt; (pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;N ≤ 1000&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;N-1 ≤ M ≤ 200.000&amp;lt;/code&amp;gt; (pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;M ≤ 1000&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 300.000&amp;lt;/code&amp;gt; (pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;Q ≤ 1000&amp;lt;/code&amp;gt;)&lt;br /&gt;
* distanța asociată unei rute este o valoare întreagă din intervalul &amp;lt;code&amp;gt;[1, 1.000.000.000]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
ATENȚIE!!! Între oricare două buncăre pot exista MAI MULTE rute de distanțe diferite sau nu. Exemplu: &amp;lt;code&amp;gt;(1 2 4)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(1 2 6)&amp;lt;/code&amp;gt; sunt două muchii între buncărele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; de distanțe &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;trumplandia.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 8 8&lt;br /&gt;
 1 2 4&lt;br /&gt;
 4 1 6&lt;br /&gt;
 3 1 2&lt;br /&gt;
 2 3 3&lt;br /&gt;
 5 2 4&lt;br /&gt;
 3 4 3&lt;br /&gt;
 4 5 5&lt;br /&gt;
 5 6 1&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 4&lt;br /&gt;
 5&lt;br /&gt;
 6&lt;br /&gt;
 7&lt;br /&gt;
 8&lt;br /&gt;
&amp;lt;code&amp;gt;trumplandia.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 13&lt;br /&gt;
 14&lt;br /&gt;
 16&lt;br /&gt;
 13&lt;br /&gt;
 13&lt;br /&gt;
 13&lt;br /&gt;
 13&lt;br /&gt;
 14&lt;br /&gt;
 13&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;trumplandia.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
    N, M, Q = map(int, fin.readline().split())&lt;br /&gt;
    edges = [tuple(map(int, fin.readline().split())) for _ in range(M)]&lt;br /&gt;
    reserve_edges = [int(fin.readline()) for _ in range(Q)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find(parent, node):&lt;br /&gt;
    if parent[node] == node:&lt;br /&gt;
        return node&lt;br /&gt;
    parent[node] = find(parent, parent[node])&lt;br /&gt;
    return parent[node]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def union(parent, rank, x, y):&lt;br /&gt;
    x = find(parent, x)&lt;br /&gt;
    y = find(parent, y)&lt;br /&gt;
    if x == y:&lt;br /&gt;
        return False&lt;br /&gt;
    if rank[x] &amp;lt; rank[y]:&lt;br /&gt;
        parent[x] = y&lt;br /&gt;
    elif rank[x] &amp;gt; rank[y]:&lt;br /&gt;
        parent[y] = x&lt;br /&gt;
    else:&lt;br /&gt;
        parent[y] = x&lt;br /&gt;
        rank[x] += 1&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def kruskal(edges, N):&lt;br /&gt;
    edges.sort(key=lambda x: x[2])  &lt;br /&gt;
&lt;br /&gt;
    parent = list(range(N + 1))  &lt;br /&gt;
    rank = [0] * (N + 1) &lt;br /&gt;
    min_cost = 0  &lt;br /&gt;
&lt;br /&gt;
    mst_edges = []  &lt;br /&gt;
&lt;br /&gt;
    for edge in edges:&lt;br /&gt;
        u, v, cost = edge&lt;br /&gt;
        if find(parent, u) != find(parent, v):&lt;br /&gt;
            union(parent, rank, u, v)&lt;br /&gt;
            min_cost += cost&lt;br /&gt;
            mst_edges.append(edge)&lt;br /&gt;
&lt;br /&gt;
    return min_cost, mst_edges&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
min_cost, mst_edges = kruskal(edges, N)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
adj_list = {i: [] for i in range(1, N + 1)}&lt;br /&gt;
for edge in mst_edges:&lt;br /&gt;
    u, v, cost = edge&lt;br /&gt;
    adj_list[u].append((v, cost))&lt;br /&gt;
    adj_list[v].append((u, cost))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;trumplandia.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    fout.write(str(min_cost) + &#039;\n&#039;)&lt;br /&gt;
    for reserve_edge in reserve_edges:&lt;br /&gt;
        reserve_cost = min_cost  &lt;br /&gt;
&lt;br /&gt;
        if reserve_edge not in [edge[:2] for edge in mst_edges]:&lt;br /&gt;
            u, v, cost = edges[reserve_edge - 1]&lt;br /&gt;
            for edge in mst_edges:&lt;br /&gt;
                if edge[0] == u or edge[1] == u or edge[0] == v or edge[1] == v:&lt;br /&gt;
                    reserve_cost += cost - edge[2]&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
        fout.write(str(reserve_cost) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0146_-_graph&amp;diff=10080</id>
		<title>0146 - graph</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0146_-_graph&amp;diff=10080"/>
		<updated>2024-06-04T02:17:23Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  Călinuţa tocmai a găsit o foaie de hârtie pe care este desenat un graf orientat aciclic cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri şi &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; arce, fiecare arc având o distanţă de valoare întreagă.  = Cerință = Dându-se &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; şi cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; arce cu distanţele dintre ele, trebuie să calculaţi pentru Călinuţa distanţa minimă dintre fiecare două noduri.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;graph.in&amp;lt;/code&amp;gt; conține pe prima...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Călinuţa tocmai a găsit o foaie de hârtie pe care este desenat un graf orientat aciclic cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri şi &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; arce, fiecare arc având o distanţă de valoare întreagă.&lt;br /&gt;
&lt;br /&gt;
= Cerință =&lt;br /&gt;
Dându-se &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; şi cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; arce cu distanţele dintre ele, trebuie să calculaţi pentru Călinuţa distanţa minimă dintre fiecare două noduri.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;graph.in&amp;lt;/code&amp;gt; conține pe prima linie numerele naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; separate printr-un singur spațiu, iar pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, reprezentând un arc de la &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; către &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; de lungime &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;graph.out&amp;lt;/code&amp;gt; conține &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii cu câte &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; valori separate prin câte un spaţiu, reprezentând matricea drumurilor minime. Dacă nu există drum de la un nod &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; la un nod &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, valoarea care trebuie afişată este &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări: =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;N ≤ 1500&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;M ≤ 30.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Numerele nodurilor sunt valori cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;&lt;br /&gt;
* Lungimea arcelor aparţine intervalului &amp;lt;code&amp;gt;[-1000; 1000]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 25% din teste &amp;lt;code&amp;gt;N ≤ 150&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;M ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte 40% din teste &amp;lt;code&amp;gt;N ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu =&lt;br /&gt;
&amp;lt;code&amp;gt;graph.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 9&lt;br /&gt;
 1 2 7&lt;br /&gt;
 2 3 -1&lt;br /&gt;
 2 4 -2&lt;br /&gt;
 2 7 3&lt;br /&gt;
 8 2 -2&lt;br /&gt;
 8 6 3&lt;br /&gt;
 5 4 2&lt;br /&gt;
 5 6 6&lt;br /&gt;
 6 7 -5&lt;br /&gt;
&amp;lt;code&amp;gt;graph.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 7 6 5 x x 10 x &lt;br /&gt;
 x 0 -1 -2 x x 3 x &lt;br /&gt;
 x x 0 x x x x x &lt;br /&gt;
 x x x 0 x x x x &lt;br /&gt;
 x x x 2 0 6 1 x &lt;br /&gt;
 x x x x x 0 -5 x &lt;br /&gt;
 x x x x x x 0 x &lt;br /&gt;
 x -2 -3 -4 x 3 -2 0&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def floyd_warshall(graph, N):&lt;br /&gt;
    distances = [[float(&#039;inf&#039;)] * N for _ in range(N)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        distances[i][i] = 0&lt;br /&gt;
&lt;br /&gt;
    for u, v, w in graph:&lt;br /&gt;
        distances[u - 1][v - 1] = w&lt;br /&gt;
&lt;br /&gt;
    for k in range(N):&lt;br /&gt;
        for i in range(N):&lt;br /&gt;
            for j in range(N):&lt;br /&gt;
                if distances[i][k] != float(&#039;inf&#039;) and distances[k][j] != float(&#039;inf&#039;):&lt;br /&gt;
                    distances[i][j] = min(distances[i][j], distances[i][k] + distances[k][j])&lt;br /&gt;
&lt;br /&gt;
    return distances&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;graph.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        graph = [tuple(map(int, fin.readline().split())) for _ in range(M)]&lt;br /&gt;
&lt;br /&gt;
    distances = floyd_warshall(graph, N)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;graph.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for row in distances:&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(map(lambda x: str(x) if x != float(&#039;inf&#039;) else &amp;quot;x&amp;quot;, row)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3547_-_vacanta2020&amp;diff=10079</id>
		<title>3547 - vacanta2020</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3547_-_vacanta2020&amp;diff=10079"/>
		<updated>2024-06-04T01:57:10Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = În anul 2020, profitând de lipsa oamenilor de pe şosele, guvernul a construit atâtea şosele încât poţi ajunge din orice oraş al patriei în oricare altul. Drumul dintre două oraşe are şi un cost, cel al benzinei consumate. Dorel s-a hotărât să plece într-o excursie, pornind din oraşul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; până într-un oraş oarecare. El profită şi de oferta guvernului de relansare a turismului, având &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; vouchere de călătorie. Un vo...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
În anul 2020, profitând de lipsa oamenilor de pe şosele, guvernul a construit atâtea şosele încât poţi ajunge din orice oraş al patriei în oricare altul. Drumul dintre două oraşe are şi un cost, cel al benzinei consumate. Dorel s-a hotărât să plece într-o excursie, pornind din oraşul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; până într-un oraş oarecare. El profită şi de oferta guvernului de relansare a turismului, având &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; vouchere de călătorie. Un voucher îl scuteşte de plata benzinei între două oraşe consecutiv vizitate, traseu pe care îl alege el pentru scutirea plăţii, de asemenea nefiind obligatorie folosirea tuturor voucherelor primite. Aflaţi costul minim al călătoriei din oraşul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; pâna la fiecare oraş.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;vacanta2020.in&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; de oraşe, numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; de drumuri între aceste oraşe şi numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; de vouchere, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii câte 3 numere &amp;lt;code&amp;gt;u v c&amp;lt;/code&amp;gt; semnificând faptul că între oraşele &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; există un drum iar costul benzinei pentru parcurgerea lui este &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;vacanta2020.out&amp;lt;/code&amp;gt; va conține pe prima linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale, reprezentând costurile deplasării de la oraşul 1 la fiecare din cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; oraşe.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 35.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤ 400.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ u ≠ v ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ c ≤ 30.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;vacanta2020.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 11 1&lt;br /&gt;
 1 2 7&lt;br /&gt;
 1 3 2&lt;br /&gt;
 2 3 3&lt;br /&gt;
 2 4 1&lt;br /&gt;
 3 4 6&lt;br /&gt;
 3 5 10&lt;br /&gt;
 4 5 4&lt;br /&gt;
 4 6 20&lt;br /&gt;
 5 6 2&lt;br /&gt;
 5 7 11&lt;br /&gt;
 6 7 3&lt;br /&gt;
&amp;lt;code&amp;gt;vacanta2020.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 0 0 1 2 4 7&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Un traseu de cost minim de la oraşul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1-3-5-6-7&amp;lt;/code&amp;gt;, costul acestuia fiind &amp;lt;code&amp;gt;2+10+2+3=17&amp;lt;/code&amp;gt;, însă având un voucher se poate elimina costul drumului &amp;lt;code&amp;gt;3-5&amp;lt;/code&amp;gt;, care are valoarea &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, costul final fiind &amp;lt;code&amp;gt;17-10=7&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
inf = float(&#039;inf&#039;)&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor din fișierul de intrare&lt;br /&gt;
with open(&amp;quot;vacanta2020.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n, m, k = map(int, f.readline().split())&lt;br /&gt;
    G = [[] for _ in range(n + 1)]&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        x, y, c = map(int, f.readline().split())&lt;br /&gt;
        G[x].append((y, c))&lt;br /&gt;
        G[y].append((x, c))&lt;br /&gt;
&lt;br /&gt;
# Initializarea distanțelor&lt;br /&gt;
d = [[inf] * (k + 1) for _ in range(n + 1)]&lt;br /&gt;
d[1][0] = 0&lt;br /&gt;
&lt;br /&gt;
# Folosirea unui heap pentru a implementa algoritmul lui Dijkstra&lt;br /&gt;
pq = [(0, 1, 0)]&lt;br /&gt;
while pq:&lt;br /&gt;
    dist, nod, nr_tickete = heapq.heappop(pq)&lt;br /&gt;
    if d[nod][nr_tickete] &amp;lt; dist:&lt;br /&gt;
        continue&lt;br /&gt;
    for nod1, cost in G[nod]:&lt;br /&gt;
        # Fără a folosi un bilet&lt;br /&gt;
        if d[nod1][nr_tickete] &amp;gt; d[nod][nr_tickete] + cost:&lt;br /&gt;
            d[nod1][nr_tickete] = d[nod][nr_tickete] + cost&lt;br /&gt;
            heapq.heappush(pq, (d[nod1][nr_tickete], nod1, nr_tickete))&lt;br /&gt;
        # Folosind un bilet&lt;br /&gt;
        if nr_tickete &amp;lt; k:&lt;br /&gt;
            if d[nod1][nr_tickete + 1] &amp;gt; d[nod][nr_tickete]:&lt;br /&gt;
                d[nod1][nr_tickete + 1] = d[nod][nr_tickete]&lt;br /&gt;
                heapq.heappush(pq, (d[nod1][nr_tickete + 1], nod1, nr_tickete + 1))&lt;br /&gt;
&lt;br /&gt;
# Scrierea rezultatelor în fișierul de ieșire&lt;br /&gt;
with open(&amp;quot;vacanta2020.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        mini = min(d[i])&lt;br /&gt;
        fout.write(str(mini) + &#039; &#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1895_-_Festivaluri&amp;diff=10078</id>
		<title>1895 - Festivaluri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1895_-_Festivaluri&amp;diff=10078"/>
		<updated>2024-06-04T01:53:51Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Tudor este foarte indecis, deoarece a fost chemat la &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; festivaluri și puterea lui fizică nu îi permite să ajungă la toate. În orașul în care locuiește sunt &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; străzi unidirecţionale și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; intersecții numerotate cu numere de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; până la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Festivalurile au loc în &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; intersecții. El pornește din intersecția cu numărul &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt;.  Pentru a ajunge dintr-o intersecți...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Tudor este foarte indecis, deoarece a fost chemat la &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; festivaluri și puterea lui fizică nu îi permite să ajungă la toate. În orașul în care locuiește sunt &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; străzi unidirecţionale și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; intersecții numerotate cu numere de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; până la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Festivalurile au loc în &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; intersecții. El pornește din intersecția cu numărul &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pentru a ajunge dintr-o intersecție în alta, folosește străzile. Când parcurge o stradă, el consumă o anumită energie, care diferă de la stradă la stradă.&lt;br /&gt;
&lt;br /&gt;
După terminarea fiecărui festival, Tudor se va reîntoarce la casa lui, adică la intersecția cu numărul &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt;, costul drumului de această dată fiind &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, pornind din nou la următorul festival.&lt;br /&gt;
&lt;br /&gt;
Întrucât este un om foarte dedicat muzicii, Tudor vrea să participe la cât mai multe festivaluri, dar fără să-și depășească puterea lui fizică &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Determinați numărul maxim de festivaluri la care poate participa.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;festivaluri.in&amp;lt;/code&amp;gt; va conține pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii se vor afla câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; numere, reprezentând intersecția de unde începe strada, intersecția unde se termină strada și energia consumată pentru a parcurge strada. Pe următorul rând, se va afla cei &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; indici ai intersecțiilor unde se vor organiza festivalurile.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;festivaluri.out&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;cnt&amp;lt;/code&amp;gt;, reprezentând numărul maxim de festivaluri la care poate participa Tudor.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n , m , z , r ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p≤ 10.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* numerele de pe cele &amp;lt;code&amp;gt;m+1&amp;lt;/code&amp;gt; linii a fișierului de intrare vor fi mai mici decât &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;&lt;br /&gt;
* este posibil ca plecând din intersecția &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; să nu se poată ajunge în toate intersecțiile&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;festivaluri.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 5 9 2 2&lt;br /&gt;
 1 2 3&lt;br /&gt;
 2 4 1&lt;br /&gt;
 4 5 2&lt;br /&gt;
 1 4 1&lt;br /&gt;
 5 7 2&lt;br /&gt;
 3 5  &lt;br /&gt;
&amp;lt;code&amp;gt;festivaluri.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict, deque&lt;br /&gt;
&lt;br /&gt;
class InParser:&lt;br /&gt;
    def __init__(self, nume):&lt;br /&gt;
        self.fin = open(nume, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def read_int(self):&lt;br /&gt;
        return int(self.fin.readline())&lt;br /&gt;
&lt;br /&gt;
    def read_values(self):&lt;br /&gt;
        return map(int, self.fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
class OutParser:&lt;br /&gt;
    def __init__(self, nume):&lt;br /&gt;
        self.fout = open(nume, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def write(self, s):&lt;br /&gt;
        self.fout.write(s)&lt;br /&gt;
&lt;br /&gt;
class Graph:&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        self.adj_list = defaultdict(list)&lt;br /&gt;
        self.n = n&lt;br /&gt;
&lt;br /&gt;
    def add_edge(self, u, v, cost):&lt;br /&gt;
        self.adj_list[u].append((v, cost))&lt;br /&gt;
&lt;br /&gt;
def max_festivals(n, m, p, z, r, streets, festivals):&lt;br /&gt;
    graph = Graph(n)&lt;br /&gt;
&lt;br /&gt;
    for start, end, cost in streets:&lt;br /&gt;
        graph.add_edge(start, end, cost)&lt;br /&gt;
&lt;br /&gt;
    visited = set()&lt;br /&gt;
    festivals_set = set(festivals)&lt;br /&gt;
    queue = deque([(z, 0, p)])  # (current_intersection, current_energy_spent, remaining_energy)&lt;br /&gt;
&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    while queue:&lt;br /&gt;
        intersection, energy_spent, remaining_energy = queue.popleft()&lt;br /&gt;
&lt;br /&gt;
        if intersection in festivals_set:&lt;br /&gt;
            cnt += 1&lt;br /&gt;
&lt;br /&gt;
        if cnt == r:&lt;br /&gt;
            return cnt&lt;br /&gt;
&lt;br /&gt;
        if energy_spent &amp;gt; remaining_energy:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        for neighbor, cost in graph.adj_list[intersection]:&lt;br /&gt;
            new_energy_spent = energy_spent + cost&lt;br /&gt;
            if new_energy_spent &amp;lt;= p and neighbor not in visited:&lt;br /&gt;
                queue.append((neighbor, new_energy_spent, p - new_energy_spent))&lt;br /&gt;
                visited.add(neighbor)&lt;br /&gt;
&lt;br /&gt;
    return cnt&lt;br /&gt;
&lt;br /&gt;
fin = InParser(&amp;quot;festivaluri.in&amp;quot;)&lt;br /&gt;
fout = OutParser(&amp;quot;festivaluri.out&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
n, m, p, z, r = fin.read_values()&lt;br /&gt;
streets = [tuple(fin.read_values()) for _ in range(m)]&lt;br /&gt;
festivals = list(fin.read_values())&lt;br /&gt;
&lt;br /&gt;
cnt = max_festivals(n, m, p, z, r, streets, festivals)&lt;br /&gt;
fout.write(str(cnt) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
fout.fout.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4161_-_Picard&amp;diff=10077</id>
		<title>4161 - Picard</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4161_-_Picard&amp;diff=10077"/>
		<updated>2024-06-04T01:34:59Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = În galaxia noastră sunt &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; planete, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Între unele dintre ele sunt calculate și cunoscute salturi warp bidirecționale de durate cunoscute, existând în total &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; astfel de salturi warp. Prin aceste salturi warp se asigură posibilitatea de navigare între oricare două planete, direct sau prin intermediul mai multor salturi warp intermediare. Flota stelară folosește foarte eficient ac...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
În galaxia noastră sunt &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; planete, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Între unele dintre ele sunt calculate și cunoscute salturi warp bidirecționale de durate cunoscute, existând în total &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; astfel de salturi warp. Prin aceste salturi warp se asigură posibilitatea de navigare între oricare două planete, direct sau prin intermediul mai multor salturi warp intermediare. Flota stelară folosește foarte eficient aceste salturi pentru a naviga între planete, adică folosește trasee formate din unul sau mai multe salturi warp astfel încât durata obținută ca sumă a duratelor salturilor warp componente să fie întotdeauna minimă pentru oricare pereche de planete.&lt;br /&gt;
&lt;br /&gt;
Proaspăt pensionat din Flota stelară, sătul de ferenghi și romulani, Jean Luc Picard dorește să se retragă pe o planetă cât mai izolată, adică o planetă pentru care suma duratelor salturilor warp folosite de Flota stelară de la ea la toate celelaltele planete din galaxie să fie maximă. Determinați planetele pe care se poate retrage Picard pentru a obține liniștea dorită. Dacă sunt mai multe planete care pot fi alese, acestea se vor afișa în ordine crescătoare a numerotării și separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;picard.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n m&amp;lt;/code&amp;gt;, iar următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii câte trei numere &amp;lt;code&amp;gt;i j L&amp;lt;/code&amp;gt;, cu semnificatia: între planetele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; există un salt warp bidirecțional de durată &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;picard.out&amp;lt;/code&amp;gt; va conține planetele cerute în ordine crescătoare a numerotării și separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;durata oricărui salt este număr întreg din intervalul [1,1000]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;picard.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 9&lt;br /&gt;
 1 3 5&lt;br /&gt;
 1 4 5&lt;br /&gt;
 1 5 4&lt;br /&gt;
 2 3 5&lt;br /&gt;
 2 4 1&lt;br /&gt;
 2 5 2&lt;br /&gt;
 3 6 2&lt;br /&gt;
 4 6 4&lt;br /&gt;
 5 6 4&lt;br /&gt;
&amp;lt;code&amp;gt;picard.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
== Explicație ==&lt;br /&gt;
 Sumele duratelor minime de la fiecare planetă la toate celelale sunt:&lt;br /&gt;
 De la planeta 1 la toate celelalte: 27 &lt;br /&gt;
 De la planeta 2 la toate celelalte: 19 &lt;br /&gt;
 De la planeta 3 la toate celelalte: 24 &lt;br /&gt;
 De la planeta 4 la toate celelalte: 19 &lt;br /&gt;
 De la planeta 5 la toate celelalte: 19 &lt;br /&gt;
 De la planeta 6 la toate celelalte: 22&lt;br /&gt;
 Prin urmare, Jean Luc Picard alege planeta 1.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def floyd_warshall(n, distances):&lt;br /&gt;
    for k in range(1, n + 1):&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            for j in range(1, n + 1):&lt;br /&gt;
                distances[i][j] = min(distances[i][j], distances[i][k] + distances[k][j])&lt;br /&gt;
&lt;br /&gt;
def find_max_distance(n, distances):&lt;br /&gt;
    max_sum = 0&lt;br /&gt;
    max_planets = []&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        current_sum = sum(distances[i][1:])&lt;br /&gt;
        if current_sum &amp;gt; max_sum:&lt;br /&gt;
            max_sum = current_sum&lt;br /&gt;
            max_planets = [i]&lt;br /&gt;
        elif current_sum == max_sum:&lt;br /&gt;
            max_planets.append(i)&lt;br /&gt;
&lt;br /&gt;
    return max_planets&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;picard.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;picard.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        distances = [[float(&#039;inf&#039;)] * (n + 1) for _ in range(n + 1)]&lt;br /&gt;
        &lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            distances[i][i] = 0&lt;br /&gt;
&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            i, j, L = map(int, fin.readline().split())&lt;br /&gt;
            distances[i][j] = distances[j][i] = L&lt;br /&gt;
&lt;br /&gt;
        floyd_warshall(n, distances)&lt;br /&gt;
        max_planets = find_max_distance(n, distances)&lt;br /&gt;
&lt;br /&gt;
        fout.write(&amp;quot; &amp;quot;.join(map(str, max_planets)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1955_-_plimbare1&amp;diff=10076</id>
		<title>1955 - plimbare1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1955_-_plimbare1&amp;diff=10076"/>
		<updated>2024-06-04T01:32:41Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Personajul acestei probleme este Lucian. Lucian locuiește în tara lui Verde Împărat, această tară având &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; orașe, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Cum în orice poveste cu împărați există și o prințesă, și în problema noastră avem o prințesă, să o numim Maria. Maria este fiica lui Verde Împărat și în același timp prietena lui Lucian.  În tara lui Verde Împărat se apropie sărbătorile, iar ca să fie sig...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Personajul acestei probleme este Lucian. Lucian locuiește în tara lui Verde Împărat, această tară având &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; orașe, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Cum în orice poveste cu împărați există și o prințesă, și în problema noastră avem o prințesă, să o numim Maria. Maria este fiica lui Verde Împărat și în același timp prietena lui Lucian.&lt;br /&gt;
&lt;br /&gt;
În tara lui Verde Împărat se apropie sărbătorile, iar ca să fie sigur de un nou mandat, împăratul a promis că va repara câteva drumuri, astfel încât să se poată ajunge din orice oraș, în oricare alt oraș, mergând doar pe drumuri care nu sunt stricate. Fiecare drum care este stricat are un cost de reparație , și având în vedere că se apropie sărbătorile, Împăratul ar vrea să repare drumurile optim, astfel încât să obțină un cost cât mai mic. Știind că Lucian vrea să-i ceară mâna Mariei, Împăratul i-a încredințat lui Lucian această sarcină, iar în cazul în care nu va putea să o îndeplinească îl va izgoni din tară. Lucian nu a fost prezent mai deloc la orele de algoritmică din liceu și vă cere vouă ajutorul pentru această problema complicată. Având la dispoziție lista drumurilor, precum și lista drumurilor stricate, voi trebuie să-i spuneți lui Lucian care este suma minimă pe care trebuie să o folosească pentru a se putea ajunge din orice oraș în oricare alt oraș.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;plimbare1.in&amp;lt;/code&amp;gt; conține pe prima linie două numere &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul de orașe și numărul de drumuri din tara lui Verde Împărat. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii vor fi descrise drumurile sub următoarea formă:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 a b&amp;lt;/code&amp;gt; – există un drum între &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 a b c&amp;lt;/code&amp;gt; – există un drum între &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; care poate fi reparat cu costul &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;plimbare1.out&amp;lt;/code&amp;gt; conține pe prima linie un număr &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, reprezentând costul minim al reparării drumurilor, pentru a se putea ajunge din orice oraș în oricare alt oraș.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
• &amp;lt;code&amp;gt;1 ≤ N ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• &amp;lt;code&amp;gt;1 ≤ M ≤ 120.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• &amp;lt;code&amp;gt;1 ≤ c ≤ 250&amp;lt;/code&amp;gt; – număr natural&lt;br /&gt;
&lt;br /&gt;
• drumurile sunt bidirecționale&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;plimbare1.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5&lt;br /&gt;
 1 1 2 &lt;br /&gt;
 1 3 4&lt;br /&gt;
 2 2 3 6&lt;br /&gt;
 2 3 5 9&lt;br /&gt;
 2 4 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;plimbare1.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 12&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Observăm că nu putem ajunge în orașul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; din orașul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, sau din orașul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; în orașul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, de aceea trebuie să reparăm un drum, astfel încât să fie posibil să ajungem în orașul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Astfel, selectam drumul &amp;lt;code&amp;gt;2 3&amp;lt;/code&amp;gt; cu costul &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;. După ce am reparat acest drum observăm că nu putem ajunge în orașul &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. Avem două drumuri posibile de reparat pentru a ajunge apoi în orașul &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;3 5&amp;lt;/code&amp;gt; cu costul &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;4 5&amp;lt;/code&amp;gt; cu costul &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;. Îl vom alege pe cel mai mic (cel cu costul &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;), astfel după ce reparăm și acest drum putem ajunge din orice oraș în oricare altul.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
Inf = float(&#039;inf&#039;)&lt;br /&gt;
&lt;br /&gt;
def init(n):&lt;br /&gt;
    return list(range(n + 1))&lt;br /&gt;
&lt;br /&gt;
def find(x, T):&lt;br /&gt;
    if x != T[x]:&lt;br /&gt;
        T[x] = find(T[x], T)&lt;br /&gt;
    return T[x]&lt;br /&gt;
&lt;br /&gt;
def union(a, b, T):&lt;br /&gt;
    T[find(a, T)] = find(b, T)&lt;br /&gt;
&lt;br /&gt;
def kruskal(G, n):&lt;br /&gt;
    rez = 0&lt;br /&gt;
    T = init(n)&lt;br /&gt;
    afis = []&lt;br /&gt;
    for x, y, z in G:&lt;br /&gt;
        r1 = find(x, T)&lt;br /&gt;
        r2 = find(y, T)&lt;br /&gt;
        if r1 != r2:&lt;br /&gt;
            rez += z&lt;br /&gt;
            afis.append((x, y))&lt;br /&gt;
            union(r1, r2, T)&lt;br /&gt;
    return rez&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;plimbare1.in&amp;quot;, &#039;r&#039;) as fin, open(&amp;quot;plimbare1.out&amp;quot;, &#039;w&#039;) as fout:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        G = []&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            line = list(map(int, fin.readline().split()))&lt;br /&gt;
            op = line[0]&lt;br /&gt;
            if op == 1:&lt;br /&gt;
                x, y = line[1:3]&lt;br /&gt;
                G.append((x, y, 0))&lt;br /&gt;
            else:&lt;br /&gt;
                x, y, w = line[1:4]&lt;br /&gt;
                G.append((x, y, w))&lt;br /&gt;
        G.sort(key=lambda x: x[2])&lt;br /&gt;
        rez = kruskal(G, n)&lt;br /&gt;
        fout.write(str(rez) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0616_-_Zapada&amp;diff=10075</id>
		<title>0616 - Zapada</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0616_-_Zapada&amp;diff=10075"/>
		<updated>2024-06-04T01:26:30Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Orașul Kruskal are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; intersecții unite prin &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; străzi bidirecționale. Datorită ninsorii de peste noapte, străzile sunt acoperite cu zăpadă. Administratorul orașului, Gigel, a determinat cu mari eforturi pentru fiecare stradă costul deszăpezirii ei și acum dorește deszăpezirea unor străzi astfel încât costul total al deszăpezirii lor să fie minim, și să se poată circula între oricare două intersecții pe străzi de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Orașul Kruskal are &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; intersecții unite prin &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; străzi bidirecționale. Datorită ninsorii de peste noapte, străzile sunt acoperite cu zăpadă. Administratorul orașului, Gigel, a determinat cu mari eforturi pentru fiecare stradă costul deszăpezirii ei și acum dorește deszăpezirea unor străzi astfel încât costul total al deszăpezirii lor să fie minim, și să se poată circula între oricare două intersecții pe străzi deszăpezite.&lt;br /&gt;
&lt;br /&gt;
Maleficul Costel îl forțează pe Gigel să deszăpezească anumite străzi, din motive doar de el știute. Ajutați-l pe Gigel să determine costul minim pentru deszăpezirea orașului, astfel încât să fie deszăpezite străzile dorite de Costel și să se poată circula între oricare două intersecții pe străzi deszăpezite.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;zapada.in&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n m&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii câte un triplet &amp;lt;code&amp;gt;i j c&amp;lt;/code&amp;gt;, cu semnificația: există stradă între intersecțiile &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt; și are costul deszăpezirii egal cu &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. Urmează o linie care conține numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; de străzi pe care Costel le dorește deszăpezite, iar următoarea linie conține &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; numere distincte între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de ordine al străzilor care vor fi obligatoriu deszăpezite.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;zapada.out&amp;lt;/code&amp;gt; va conține pe prima linie costul total minim al deszăpezirii orașului, în condițiile precizate.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k &amp;lt; m ≤ n*(n-1)/2&amp;lt;/code&amp;gt;&lt;br /&gt;
* costurile deszăpezirii străzilor sunt numere naturale nenule cel mult egale cu &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* numerele celor &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; străzi care trebuie deszăpezite sunt dintre numerele de ordine ale celor &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; străzi date&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;zapada.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 11&lt;br /&gt;
 1 2 2&lt;br /&gt;
 1 7 4&lt;br /&gt;
 2 3 3&lt;br /&gt;
 2 5 2&lt;br /&gt;
 2 6 3&lt;br /&gt;
 2 7 3&lt;br /&gt;
 3 4 1&lt;br /&gt;
 3 5 2&lt;br /&gt;
 4 5 1&lt;br /&gt;
 5 6 3&lt;br /&gt;
 6 7 5&lt;br /&gt;
 2&lt;br /&gt;
 2 11&lt;br /&gt;
&amp;lt;code&amp;gt;zapada.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 15&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Alături de străzile &amp;lt;code&amp;gt;1-7&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;6-7&amp;lt;/code&amp;gt; care trebuie obligatoriu deszăpezite, se mai deszăpezesc străzile: &amp;lt;code&amp;gt;1-2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2-5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4-5&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;3-4&amp;lt;/code&amp;gt;. Costul total al deszăpezirii acestor străzi este &amp;lt;code&amp;gt;4+5+2+2+1+1=15&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
class Muchie:&lt;br /&gt;
    def __init__(self, nod1, nod2, cost):&lt;br /&gt;
        self.nod1 = nod1&lt;br /&gt;
        self.nod2 = nod2&lt;br /&gt;
        self.cost = cost&lt;br /&gt;
&lt;br /&gt;
def cmp(a, b):&lt;br /&gt;
    return a.cost &amp;lt; b.cost&lt;br /&gt;
&lt;br /&gt;
def radacina(a, t):&lt;br /&gt;
    r = a&lt;br /&gt;
    while t[r] != r:&lt;br /&gt;
        r = t[r]&lt;br /&gt;
    while t[a] != a:&lt;br /&gt;
        b = t[a]&lt;br /&gt;
        t[a] = r&lt;br /&gt;
        a = b&lt;br /&gt;
    return r&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;zapada.in&amp;quot;, &#039;r&#039;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        v = [None] * (m + 1)&lt;br /&gt;
        for i in range(1, m + 1):&lt;br /&gt;
            nod1, nod2, cost = map(int, f.readline().split())&lt;br /&gt;
            v[i] = Muchie(nod1, nod2, cost)  # Am adăugat crearea obiectului de tip Muchie&lt;br /&gt;
        t = list(range(n + 1))&lt;br /&gt;
&lt;br /&gt;
        k = int(f.readline())&lt;br /&gt;
        strazi_dorite = list(map(int, f.readline().split()))  # Citim lista de străzi dorite&lt;br /&gt;
        sum = 0&lt;br /&gt;
        for x in strazi_dorite:  # Iterăm prin străzile dorite și adăugăm costurile lor&lt;br /&gt;
            sum += v[x].cost&lt;br /&gt;
            v[x].cost = 0&lt;br /&gt;
&lt;br /&gt;
        v = v[1:]  # Skip the first element which is None&lt;br /&gt;
        v.sort(key=lambda x: x.cost)&lt;br /&gt;
&lt;br /&gt;
        nr_arb = 1&lt;br /&gt;
        for i in range(len(v)):&lt;br /&gt;
            if nr_arb &amp;gt;= n:&lt;br /&gt;
                break&lt;br /&gt;
            r1 = radacina(v[i].nod1, t)&lt;br /&gt;
            r2 = radacina(v[i].nod2, t)&lt;br /&gt;
            if r1 == r2:&lt;br /&gt;
                continue&lt;br /&gt;
            t[r2] = r1&lt;br /&gt;
            sum += v[i].cost&lt;br /&gt;
            nr_arb += 1&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;zapada.out&amp;quot;, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(str(sum))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3262_-_Rain&amp;diff=10074</id>
		<title>3262 - Rain</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3262_-_Rain&amp;diff=10074"/>
		<updated>2024-06-04T00:17:51Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Bariere impermeabile de înălțimi diferite sunt plasate perpendicular pe lungimea unei cuve dreptunghiulare. Distanța dintre oricare două bariere alăturate este de un centimetru. Cuva nu are capac și atunci când plouă destul, cuva este umplută cu apă. Unele bariere pot fi înălțate cu o valoare întreagă care nu poate depăși o valoare dată.  = Cerința = Care este numărul minim de bariere care trebuie înălțate astfel încât să fie colectată în cuvă o...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bariere impermeabile de înălțimi diferite sunt plasate perpendicular pe lungimea unei cuve dreptunghiulare. Distanța dintre oricare două bariere alăturate este de un centimetru. Cuva nu are capac și atunci când plouă destul, cuva este umplută cu apă. Unele bariere pot fi înălțate cu o valoare întreagă care nu poate depăși o valoare dată.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Care este numărul minim de bariere care trebuie înălțate astfel încât să fie colectată în cuvă o cantitate maximă de apă?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; de bariere. A doua linie conține înălțimile celor &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; bariere, luate de la stânga la dreapta. A treia linie conține numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; de bariere cărora li se poate crește înălțimea. Urmează atâtea linii câte bariere sunt cărora le putem crește înălțimea. Fiecare din aceste linii conține numărul barierei și creșterea maximă în centimetri în înălțime care se poate face. Numerotarea barierelor se face începând cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran doi întregi separați prin spațiu, numărul minim de bariere cărora li se va mări înălțimea și cantitatea maximă de apă ce poate fi colectată după mărire.&lt;br /&gt;
&lt;br /&gt;
Observație: Se calculează cantitatea în centimetri cubi deoarece considerăm adâncimea cuvei de un centimetru. Considerăm fața și spatele pereți ai cuvei (cea care este înspre noi și cea care este în spate) ca fiind mai înalte decât înălțimea oricărei bariere. Pereții din stânga și din dreapta ai cuvei coincid cu cea mai din stânga și respectiv cea mai din dreapta barieră, chiar și după ce acestea vor fi eventual înălțate.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; n &amp;lt; 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* înălțimile inițiale ale celor &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; bariere sunt numere naturale mai mici sau egale cu &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* barierele vor fi înălțate cu maximum &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 6&lt;br /&gt;
 2 4 2 4 2 1&lt;br /&gt;
 2&lt;br /&gt;
 2 1&lt;br /&gt;
 4 1&lt;br /&gt;
Ieșire&lt;br /&gt;
 1 14&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Nu se crește înălțimea barierei &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; deoarece nu va modifica întreaga cantitate de apă. Vom crește cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; centimetru înălțimea barierei de la poziția &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, care va mări cantitatea totală de apă cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; centimetru cub.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
nMax = 1000000&lt;br /&gt;
H = [0] * nMax&lt;br /&gt;
max_dH = [0] * nMax&lt;br /&gt;
LR = []&lt;br /&gt;
RL = []&lt;br /&gt;
n = 0&lt;br /&gt;
dn = 0&lt;br /&gt;
KL = 0&lt;br /&gt;
KR = 0&lt;br /&gt;
countB = 0&lt;br /&gt;
volume = 0&lt;br /&gt;
L = -1&lt;br /&gt;
R = -1&lt;br /&gt;
&lt;br /&gt;
def input_data():&lt;br /&gt;
    global n, H, dn, max_dH&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    H[:n] = map(int, input().split())&lt;br /&gt;
    dn = int(input())&lt;br /&gt;
    for _ in range(dn):&lt;br /&gt;
        j, dH = map(int, input().split())&lt;br /&gt;
        max_dH[j] = dH&lt;br /&gt;
        H[j] += dH&lt;br /&gt;
&lt;br /&gt;
def scan():&lt;br /&gt;
    global KL, KR, L, R&lt;br /&gt;
    KL = 0&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if H[KL] &amp;lt; H[i]:&lt;br /&gt;
            L = KL&lt;br /&gt;
            LR.append(KL)&lt;br /&gt;
            KL = i&lt;br /&gt;
    KR = n - 1&lt;br /&gt;
    for i in range(n - 2, KL - 1, -1):&lt;br /&gt;
        if H[KR] &amp;lt; H[i]:&lt;br /&gt;
            R = KR&lt;br /&gt;
            RL.append(KR)&lt;br /&gt;
            KR = i&lt;br /&gt;
&lt;br /&gt;
def solve():&lt;br /&gt;
    global countB, volume, L, R&lt;br /&gt;
    if LR:&lt;br /&gt;
        LR.append(KL)&lt;br /&gt;
        for i in range(len(LR) - 1):&lt;br /&gt;
            if max_dH[LR[i]] &amp;gt; 0:&lt;br /&gt;
                countB += 1&lt;br /&gt;
            volume += H[LR[i]] * (LR[i + 1] - LR[i])&lt;br /&gt;
    if RL:&lt;br /&gt;
        RL.append(KR)&lt;br /&gt;
        for i in range(len(RL) - 1):&lt;br /&gt;
            if max_dH[RL[i]] &amp;gt; 0:&lt;br /&gt;
                countB += 1&lt;br /&gt;
            volume += H[RL[i]] * (RL[i] - RL[i + 1])&lt;br /&gt;
    if KL &amp;lt; KR:&lt;br /&gt;
        if max_dH[KL] &amp;gt; 0:&lt;br /&gt;
            countB += 1&lt;br /&gt;
        if max_dH[KR] &amp;gt; 0:&lt;br /&gt;
            countB += 1&lt;br /&gt;
        volume += H[KL] * (KR - KL)&lt;br /&gt;
    else:&lt;br /&gt;
        HLmax = H[L] if L != -1 else 0&lt;br /&gt;
        HRmax = H[R] if R != -1 else 0&lt;br /&gt;
        if HLmax != HRmax:&lt;br /&gt;
            if H[KL] - max_dH[KL] &amp;lt; max(HRmax, HLmax):&lt;br /&gt;
                countB += 1&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    input_data()&lt;br /&gt;
    scan()&lt;br /&gt;
    solve()&lt;br /&gt;
    print(countB, volume)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4170_%E2%80%93_Fl%C8%99iDesc&amp;diff=10073</id>
		<title>4170 – FlșiDesc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4170_%E2%80%93_Fl%C8%99iDesc&amp;diff=10073"/>
		<updated>2024-06-03T23:52:55Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă: Se consideră o listă liniară simplu înlănțuită, alocată dinamic, în care elementele sunt de tipul declarat mai jos:  struct Nod  {      int info;      Nod *leg;  }; în care câmpul &amp;lt;code&amp;gt;info&amp;lt;/code&amp;gt; memorează un număr natural nenul, iar câmpul &amp;lt;code&amp;gt;leg&amp;lt;/code&amp;gt; memorează adresa următorului element al listei.  = Cerinţa = Să se scrie o funcție C++ cu următorul prototip:  void FLsiDesc(Nod *head); Lista are cel puțin un nod și are adresa primului element mem...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o listă liniară simplu înlănțuită, alocată dinamic, în care elementele sunt de tipul declarat mai jos:&lt;br /&gt;
 struct Nod&lt;br /&gt;
 {&lt;br /&gt;
     int info;&lt;br /&gt;
     Nod *leg;&lt;br /&gt;
 };&lt;br /&gt;
în care câmpul &amp;lt;code&amp;gt;info&amp;lt;/code&amp;gt; memorează un număr natural nenul, iar câmpul &amp;lt;code&amp;gt;leg&amp;lt;/code&amp;gt; memorează adresa următorului element al listei.&lt;br /&gt;
&lt;br /&gt;
= Cerinţa =&lt;br /&gt;
Să se scrie o funcție C++ cu următorul prototip:&lt;br /&gt;
 void FLsiDesc(Nod *head);&lt;br /&gt;
Lista are cel puțin un nod și are adresa primului element memorată în pointerul &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. Informațiile memorate în noduri sunt ordonate strict descrescător. Funcția inserează noduri astfel încât în final lista va memora în ordine descrescătoare toate numerele de la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; este valoarea memorată inițial în primul nod al listei. De exemplu, dacă lista conține inițial informațiile &amp;lt;code&amp;gt;7,4,3&amp;lt;/code&amp;gt;, atunci la final lista va fi: &amp;lt;code&amp;gt;7,6,5,4,3,2,1&amp;lt;/code&amp;gt;. Dacă lista conține inițial doar informația &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, atunci la final lista va fi &amp;lt;code&amp;gt;3,2,1&amp;lt;/code&amp;gt;. Dacă lista conține inițial &amp;lt;code&amp;gt;2,1&amp;lt;/code&amp;gt;, atunci la final lista va fi &amp;lt;code&amp;gt;2,1&amp;lt;/code&amp;gt;. Atenție, doar inserați nodurile care lipsesc, nu efectuați alte operații.&lt;br /&gt;
&lt;br /&gt;
= Important =&lt;br /&gt;
Soluţia propusă va conţine definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
     if node is None or node.info &amp;gt; value:&lt;br /&gt;
            new_node = Nod(value)&lt;br /&gt;
            new_node.leg = node&lt;br /&gt;
            return new_node&lt;br /&gt;
        else:&lt;br /&gt;
            node.leg = insert_desc(node.leg, value)&lt;br /&gt;
&lt;br /&gt;
        return node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    for i in range(head.info, 0, -1):&lt;br /&gt;
        head = insert_desc(head, i)&lt;br /&gt;
&lt;br /&gt;
    return head&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
head = Nod(7)&lt;br /&gt;
head.leg = Nod(4)&lt;br /&gt;
head.leg.leg = Nod(3)&lt;br /&gt;
head = FLsiDesc(head)&lt;br /&gt;
while head:&lt;br /&gt;
    print(head.info)&lt;br /&gt;
    head = head.leg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3914_-_Cuvinte12&amp;diff=10072</id>
		<title>3914 - Cuvinte12</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3914_-_Cuvinte12&amp;diff=10072"/>
		<updated>2024-06-03T23:42:29Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se citește un cuvânt &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; format din litere mici distincte ale alfabetului englez și un număr &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Afișați în ordine lexicografică toate cuvintele formate din cel mult &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; litere ordonate alfabetic din &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, în care nu există consoane alăturate și încep cu vocală.  = Date de intrare = Programul citește de la tastatură cuvântul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; și numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;.  = Date de ieșire = Programul va...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se citește un cuvânt &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; format din litere mici distincte ale alfabetului englez și un număr &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Afișați în ordine lexicografică toate cuvintele formate din cel mult &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; litere ordonate alfabetic din &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, în care nu există consoane alăturate și încep cu vocală.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură cuvântul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; și numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran cuvintele cerute, câte unul pe un rând.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; m ≤&amp;lt;/code&amp;gt; lungimea lui &amp;lt;code&amp;gt;S ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 barni 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 a&lt;br /&gt;
 ab&lt;br /&gt;
 abi&lt;br /&gt;
 ai&lt;br /&gt;
 ain&lt;br /&gt;
 air&lt;br /&gt;
 an&lt;br /&gt;
 ar&lt;br /&gt;
 i&lt;br /&gt;
 in&lt;br /&gt;
 ir&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def generate_words(word, m, current_word, index, vowels_count):&lt;br /&gt;
    if len(current_word) &amp;gt; m or (len(current_word) &amp;gt; 0 and current_word[-1] in &#039;aeiou&#039;):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if len(current_word) &amp;gt; 0:&lt;br /&gt;
        print(current_word)&lt;br /&gt;
&lt;br /&gt;
    if index == len(word):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for i in range(index, len(word)):&lt;br /&gt;
        if word[i] in &#039;aeiou&#039;:&lt;br /&gt;
            generate_words(word, m, current_word + word[i], i + 1, 1)&lt;br /&gt;
        else:&lt;br /&gt;
            generate_words(word, m, current_word + word[i], i + 1, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
word, m = input().split()&lt;br /&gt;
m = int(m)&lt;br /&gt;
word = &#039;&#039;.join(sorted(word, key=lambda x: &#039;aeiou&#039;.index(x) if x in &#039;aeiou&#039; else 99))&lt;br /&gt;
generate_words(word, m, &#039;&#039;, 0, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3913_-_Cuvinte11&amp;diff=10071</id>
		<title>3913 - Cuvinte11</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3913_-_Cuvinte11&amp;diff=10071"/>
		<updated>2024-06-03T23:34:23Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se citește un cuvânt &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; format din litere mici distincte ale alfabetului englez și un număr &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Afișați în ordine lexicografică toate cuvintele formate din cel puțin &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; litere ordonate alfabetic din &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, în care nu există vocale alăturate și se termină cu consoană.  = Date de intrare = Programul citește de la tastatură cuvântul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; și numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;.  = Date de ieșire = Progra...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se citește un cuvânt &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; format din litere mici distincte ale alfabetului englez și un număr &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Afișați în ordine lexicografică toate cuvintele formate din cel puțin &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; litere ordonate alfabetic din &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, în care nu există vocale alăturate și se termină cu consoană.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură cuvântul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; și numărul &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran cuvintele cerute, câte unul pe un rând.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; m ≤&amp;lt;/code&amp;gt; lungimea lui &amp;lt;code&amp;gt;S ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 barni 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 abin&lt;br /&gt;
 abinr&lt;br /&gt;
 abir&lt;br /&gt;
 abn&lt;br /&gt;
 abnr&lt;br /&gt;
 abr&lt;br /&gt;
 anr&lt;br /&gt;
 bin&lt;br /&gt;
 binr&lt;br /&gt;
 bir&lt;br /&gt;
 bnr&lt;br /&gt;
 inr&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def generate_words(word, m, current_word, index, vowels_count):&lt;br /&gt;
    if len(current_word) &amp;gt;= m:&lt;br /&gt;
        print(current_word)&lt;br /&gt;
    if index == len(word):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for i in range(index, len(word)):&lt;br /&gt;
        if word[i] not in &#039;aeiou&#039;:&lt;br /&gt;
            generate_words(word, m, current_word + word[i], i + 1, 0)&lt;br /&gt;
        elif vowels_count == 0:&lt;br /&gt;
            generate_words(word, m, current_word + word[i], i + 1, 1)&lt;br /&gt;
&lt;br /&gt;
word, m = input().split()&lt;br /&gt;
m = int(m)&lt;br /&gt;
generate_words(word, m, &#039;&#039;, 0, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0870_-_Depou&amp;diff=10070</id>
		<title>0870 - Depou</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0870_-_Depou&amp;diff=10070"/>
		<updated>2024-06-03T23:00:59Z</updated>

		<summary type="html">&lt;p&gt;Danciu: Pagină nouă:  = Cerința = Se consideră un depou de cale ferată precum cel din imagine:  Pe linia &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; se află &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vagoane, numerotate cu valori distincte de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, într-o ordine oarecare. Vagoanele trebuie mutate pe linia &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, în ordinea &amp;lt;code&amp;gt;1 2 .. n&amp;lt;/code&amp;gt;. Pentru aceasta se poate muta câte un vagon de pe o linie pe alta, în ordinea indicată de săgeți:  * &amp;lt;code&amp;gt;A -&amp;gt; B&amp;lt;/code&amp;gt;, * &amp;lt;code&amp;gt;A -&amp;gt; C&amp;lt;/code&amp;gt; * &amp;lt;code&amp;gt;B -&amp;gt; C&amp;lt;/...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se consideră un depou de cale ferată precum cel din imagine:&lt;br /&gt;
&lt;br /&gt;
Pe linia &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; se află &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vagoane, numerotate cu valori distincte de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, într-o ordine oarecare. Vagoanele trebuie mutate pe linia &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, în ordinea &amp;lt;code&amp;gt;1 2 .. n&amp;lt;/code&amp;gt;. Pentru aceasta se poate muta câte un vagon de pe o linie pe alta, în ordinea indicată de săgeți:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;A -&amp;gt; B&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;A -&amp;gt; C&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;B -&amp;gt; C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Să se determine o succesiune de operații care să mute toate vagoanele de pe linia &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; pe linia &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; în ordinea dorită.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale distincte cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, reprezentând ordinea vagoanelor de pe linia &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; de operații efectuate, apoi cele &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; operații. Fiecare operație va fi afișată pe câte o linie a ecranului, și va consta din două caractere de forma &amp;lt;code&amp;gt;X Y&amp;lt;/code&amp;gt;, semnificând faptul că se mută un vagon de pe linia &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; pe linia &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;. Dacă nu este posibilă mutarea vagoanelor de pe linia &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; pe linia &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, numărul de operații afișat va fi &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 4&lt;br /&gt;
 2 1 3 4&lt;br /&gt;
Ieșire&lt;br /&gt;
 6&lt;br /&gt;
 A B&lt;br /&gt;
 A B&lt;br /&gt;
 A C&lt;br /&gt;
 A C&lt;br /&gt;
 B C&lt;br /&gt;
 B C&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Ordinea inițială a vagoanelor este următoarea:&lt;br /&gt;
&lt;br /&gt;
După mutarea vagoanele vor fi în ordinea:&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def main():&lt;br /&gt;
    a = [0] * 1001&lt;br /&gt;
    d = [[0] * 3 for _ in range(2001)]&lt;br /&gt;
    b = [0] * 1001&lt;br /&gt;
&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    a[1:n + 1] = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    vf = 0&lt;br /&gt;
    vagon = 1&lt;br /&gt;
    op = 0&lt;br /&gt;
    ok = 1&lt;br /&gt;
    i = n&lt;br /&gt;
&lt;br /&gt;
    while vagon &amp;lt;= n and ok == 1:&lt;br /&gt;
        if vagon == a[i]:&lt;br /&gt;
            op += 1&lt;br /&gt;
            vagon += 1&lt;br /&gt;
            i -= 1&lt;br /&gt;
            d[op][0] = 1&lt;br /&gt;
            d[op][1] = 3&lt;br /&gt;
        elif vf &amp;gt; 0 and b[vf] == vagon:&lt;br /&gt;
            op += 1&lt;br /&gt;
            vagon += 1&lt;br /&gt;
            vf -= 1&lt;br /&gt;
            d[op][0] = 2&lt;br /&gt;
            d[op][1] = 3&lt;br /&gt;
        elif i &amp;gt;= 1:&lt;br /&gt;
            op += 1&lt;br /&gt;
            d[op][0] = 1&lt;br /&gt;
            d[op][1] = 2&lt;br /&gt;
            vf += 1&lt;br /&gt;
            b[vf] = a[i]&lt;br /&gt;
            i -= 1&lt;br /&gt;
        elif vagon &amp;gt;= 1 and i == 0 and vf &amp;gt; 0:&lt;br /&gt;
            ok = 0&lt;br /&gt;
&lt;br /&gt;
    if ok == 0:&lt;br /&gt;
        print(0)&lt;br /&gt;
    else:&lt;br /&gt;
        print(op)&lt;br /&gt;
        for i in range(1, op + 1):&lt;br /&gt;
            if d[i][0] == 1:&lt;br /&gt;
                print(&amp;quot;A&amp;quot;, end=&amp;quot; &amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;B&amp;quot;, end=&amp;quot; &amp;quot;)&lt;br /&gt;
            if d[i][1] == 2:&lt;br /&gt;
                print(&amp;quot;B&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;C&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danciu</name></author>
	</entry>
</feed>