<?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=Oros+Ioana+Diana</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=Oros+Ioana+Diana"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Oros_Ioana_Diana"/>
	<updated>2026-05-01T04:42:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0591_-_Firma&amp;diff=9830</id>
		<title>0591 - Firma</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0591_-_Firma&amp;diff=9830"/>
		<updated>2024-05-18T20:24:46Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerința = Într-o țară sunt &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;, unite între ele prin &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; șosele bidirecționale de lungimi cunoscute, între oricare două orașe existând drum, fie șosea directă, fie prin alte orașe. O firmă dorește să-și stabilească sediul în unul dintre orașe, astfel încât suma lungimilor drumurilor minime de la orașul în care se află sediul la toate celelaltele orașe să fie minimă....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Într-o țară sunt &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;, unite între ele prin &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; șosele bidirecționale de lungimi cunoscute, între oricare două orașe existând drum, fie șosea directă, fie prin alte orașe. O firmă dorește să-și stabilească sediul în unul dintre orașe, astfel încât suma lungimilor drumurilor minime de la orașul în care se află sediul la toate celelaltele orașe să fie minimă. Determinați orașul care va fi ales pentru sediul firmei. Dacă sunt mai multe orașe care pot fi alese, se va alege cel cu numărul de ordine mai mic.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;firmaIN.txt&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 orașele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; există o șosea directă de lungime &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;firmaOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, reprezentând numărul de ordine al orașului care va ales ca sediu pentru firmă.&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;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;firmaIN.txt&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;firmaOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, m):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        with open(&amp;quot;firmaOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dijkstra(nod, n, G):&lt;br /&gt;
    D = [float(&#039;inf&#039;)] * (n + 1)&lt;br /&gt;
    D[nod] = 0&lt;br /&gt;
    Q = [(0, nod)]&lt;br /&gt;
    while Q:&lt;br /&gt;
        x, y = heapq.heappop(Q)&lt;br /&gt;
        if x &amp;gt; D[y]:&lt;br /&gt;
            continue&lt;br /&gt;
        for nodnou, costnou in G[y]:&lt;br /&gt;
            if D[nodnou] &amp;gt; D[y] + costnou:&lt;br /&gt;
                D[nodnou] = D[y] + costnou&lt;br /&gt;
                heapq.heappush(Q, (D[nodnou], nodnou))&lt;br /&gt;
    return D&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;firmaIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        &lt;br /&gt;
        if not check_restrictions(n, m):&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        G = [[] for _ in range(n + 1)]&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y, w = map(int, fin.readline().split())&lt;br /&gt;
            G[x].append((y, w))&lt;br /&gt;
            G[y].append((x, w))&lt;br /&gt;
&lt;br /&gt;
    minim = float(&#039;inf&#039;)&lt;br /&gt;
    mini = -1&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        s = 0&lt;br /&gt;
        D = dijkstra(i, n, G)&lt;br /&gt;
        for j in range(1, n + 1):&lt;br /&gt;
            if D[j] != float(&#039;inf&#039;):&lt;br /&gt;
                s += D[j]&lt;br /&gt;
&lt;br /&gt;
        if s &amp;lt; minim:&lt;br /&gt;
            minim = s&lt;br /&gt;
            mini = i&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;firmaOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(mini))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0589_-_Roy-Floyd&amp;diff=9829</id>
		<title>0589 - Roy-Floyd</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0589_-_Roy-Floyd&amp;diff=9829"/>
		<updated>2024-05-18T20:15:58Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerința = Se dă un graf orientat ponderat 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 – în care fiecare arc are asociat un cost, număr natural strict pozitiv. Folosind algoritmul Roy-Floyd, construiți matricea costurilor minime, &amp;lt;code&amp;gt;a[i][j]&amp;lt;/code&amp;gt; fiind costul minim al unui drum de la &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, dacă există un asemenea drum, sau &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; în caz contrar.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;roy-floydIN.txt&amp;lt;/code&amp;gt; con...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un graf orientat ponderat 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 – în care fiecare arc are asociat un cost, număr natural strict pozitiv. Folosind algoritmul Roy-Floyd, construiți matricea costurilor minime, &amp;lt;code&amp;gt;a[i][j]&amp;lt;/code&amp;gt; fiind costul minim al unui drum de la &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, dacă există un asemenea drum, sau &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; în caz contrar.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;roy-floydIN.txt&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 linii câte un triplet &amp;lt;code&amp;gt;i j c&amp;lt;/code&amp;gt;, cu semnificația: există arcul &amp;lt;code&amp;gt;(i j)&amp;lt;/code&amp;gt; și are 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 de ieșire &amp;lt;code&amp;gt;roy-floydOUT.txt&amp;lt;/code&amp;gt; va conține matricea construită, câte o linie a matricei pe o linie a fișierului, elementele de pe fiecare linie 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 ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* costul unui arc va fi mai mic decât &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* costul unui drum este egal cu suma costurilor arcelor care îl compun&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;roy-floydIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 6&lt;br /&gt;
 1 3 1&lt;br /&gt;
 2 1 2&lt;br /&gt;
 4 2 1&lt;br /&gt;
 4 3 8&lt;br /&gt;
 5 3 5&lt;br /&gt;
 5 4 2&lt;br /&gt;
&amp;lt;code&amp;gt;roy-floydOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 -1 1 -1 -1 &lt;br /&gt;
 2 0 3 -1 -1 &lt;br /&gt;
 -1 -1 0 -1 -1 &lt;br /&gt;
 3 1 4 0 -1 &lt;br /&gt;
 5 3 5 2 0 &lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
INFINIT = 1000000000&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, m, costuri):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    if any(c &amp;gt;= 1000 for _, _, c in costuri):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def roy_floyd():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;roy-floydIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            linie = fin.readline().strip()&lt;br /&gt;
            if not linie:&lt;br /&gt;
                raise ValueError(&amp;quot;Linia de intrare este goala.&amp;quot;)&lt;br /&gt;
            n, m = map(int, linie.split())&lt;br /&gt;
            costuri = [tuple(map(int, fin.readline().split())) for _ in range(m)]&lt;br /&gt;
    except ValueError as e:&lt;br /&gt;
        with open(&amp;quot;roy-floydOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(f&amp;quot;Datele nu corespund restrictiilor impuse: {e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(n, m, costuri):&lt;br /&gt;
        with open(&amp;quot;roy-floydOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    a = [[INFINIT] * (n + 1) for _ in range(n + 1)]&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        a[i][i] = 0&lt;br /&gt;
    &lt;br /&gt;
    for i, j, c in costuri:&lt;br /&gt;
        a[i][j] = c&lt;br /&gt;
    &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;
                if a[i][j] &amp;gt; a[i][k] + a[k][j]:&lt;br /&gt;
                    a[i][j] = a[i][k] + a[k][j]&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;roy-floydOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            for j in range(1, n + 1):&lt;br /&gt;
                fout.write(f&amp;quot;{-1 if a[i][j] == INFINIT else a[i][j]} &amp;quot;)&lt;br /&gt;
            fout.write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    roy_floyd()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0593_-_Parc&amp;diff=9828</id>
		<title>0593 - Parc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0593_-_Parc&amp;diff=9828"/>
		<updated>2024-05-18T20:00:13Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerința = Parcul orașului este alcătuit din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; intersecții, 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;, unite între ele prin &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; alei bidirecționale, fiecare având o anumita lungime. Într-o intersecție precizată &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; se organizează un concert; de asemenea, unele intersecții, precizate și ele, reprezintă porți de intrare în parc, accesul fiind posibil doar prin aceste porți.  Gigel poate ajunge cu mașina la oricare di...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Parcul orașului este alcătuit din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; intersecții, 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;, unite între ele prin &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; alei bidirecționale, fiecare având o anumita lungime. Într-o intersecție precizată &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; se organizează un concert; de asemenea, unele intersecții, precizate și ele, reprezintă porți de intrare în parc, accesul fiind posibil doar prin aceste porți.&lt;br /&gt;
&lt;br /&gt;
Gigel poate ajunge cu mașina la oricare dintre aceste porți, dar vă roagă să alegeți pentru el acea poartă pentru care distanța până la intersecția &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; este minimă. Dacă există mai multe porți cu această proprietate se va determina poarta cu numărul de ordine mai mic.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;parcIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n m C&amp;lt;/code&amp;gt;; 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 L&amp;lt;/code&amp;gt;, cu semnificația: există alee între intersecția &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și intersecția &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; și are lungimea &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;. Următoarea linie conține numărul de porți &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;; ultima linie conține &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; numere diferite, reprezentând porțile.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;parcOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul de ordine al porții alese.&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;
* lungimea unei alei va fi mai mică decât &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* între oricare două intersecții există drum, direct sau prin intermediul altor intersecții În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;parcIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 8 2&lt;br /&gt;
 1 2 4&lt;br /&gt;
 1 5 1&lt;br /&gt;
 1 7 2&lt;br /&gt;
 2 3 9&lt;br /&gt;
 2 4 2&lt;br /&gt;
 2 6 2&lt;br /&gt;
 2 7 1&lt;br /&gt;
 5 6 7&lt;br /&gt;
 2&lt;br /&gt;
 3 5&lt;br /&gt;
&amp;lt;code&amp;gt;parcOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;parcIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 8 2&lt;br /&gt;
 1 2 4&lt;br /&gt;
 1 5 1&lt;br /&gt;
 1 7 2&lt;br /&gt;
 2 3 9&lt;br /&gt;
 2 4 2&lt;br /&gt;
 2 6 2&lt;br /&gt;
 2 7 1&lt;br /&gt;
 5 6 7&lt;br /&gt;
 2&lt;br /&gt;
 3 5&lt;br /&gt;
&amp;lt;code&amp;gt;parcOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
MAX = 100&lt;br /&gt;
&lt;br /&gt;
def citire_date():&lt;br /&gt;
    with open(&#039;parcIN.txt&#039;, &#039;r&#039;) as fin:&lt;br /&gt;
        n, m, C = map(int, fin.readline().strip().split())&lt;br /&gt;
        muchii = [dict() for _ in range(MAX + 1)]&lt;br /&gt;
        lungimi = [dict() for _ in range(MAX + 1)]&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            i, j, L = map(int, fin.readline().strip().split())&lt;br /&gt;
            muchii[i][j] = muchii[j][i] = True&lt;br /&gt;
            lungimi[i][j] = lungimi[j][i] = L&lt;br /&gt;
        P = int(fin.readline().strip())&lt;br /&gt;
        p_list = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
    return n, m, C, muchii, lungimi, P, p_list&lt;br /&gt;
&lt;br /&gt;
def validare_restrictii(n, m, lungimi):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for nod in range(1, n+1):&lt;br /&gt;
        for lungime in lungimi[nod].values():&lt;br /&gt;
            if lungime &amp;gt;= 1000:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dijkstra(n, muchii, lungimi, start):&lt;br /&gt;
    lenMin = [float(&#039;inf&#039;)] * (n + 1)&lt;br /&gt;
    lenMin[start] = 0&lt;br /&gt;
    heap = [(0, start)]&lt;br /&gt;
    while heap:&lt;br /&gt;
        current_len, node = heapq.heappop(heap)&lt;br /&gt;
        if current_len &amp;gt; lenMin[node]:&lt;br /&gt;
            continue&lt;br /&gt;
        for neighbor in muchii[node]:&lt;br /&gt;
            length = current_len + lungimi[node][neighbor]&lt;br /&gt;
            if length &amp;lt; lenMin[neighbor]:&lt;br /&gt;
                lenMin[neighbor] = length&lt;br /&gt;
                heapq.heappush(heap, (length, neighbor))&lt;br /&gt;
    return lenMin&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m, C, muchii, lungimi, P, p_list = citire_date()&lt;br /&gt;
    if not validare_restrictii(n, m, lungimi):&lt;br /&gt;
        with open(&#039;parcOUT.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    lenMinP = float(&#039;inf&#039;)&lt;br /&gt;
    pMin = -1&lt;br /&gt;
    for p in p_list:&lt;br /&gt;
        lenMin = dijkstra(n, muchii, lungimi, p)&lt;br /&gt;
        if lenMin[C] &amp;lt; lenMinP:&lt;br /&gt;
            lenMinP = lenMin[C]&lt;br /&gt;
            pMin = p&lt;br /&gt;
&lt;br /&gt;
    with open(&#039;parcOUT.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        fout.write(str(pMin))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0592_-_Kruskal&amp;diff=9827</id>
		<title>0592 - Kruskal</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0592_-_Kruskal&amp;diff=9827"/>
		<updated>2024-05-18T19:55:47Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerința = Se dă un graf neorientat ponderat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; muchii – în care fiecare muchie are asociat un cost, număr natural strict pozitiv. Folosind algoritmul lui Kruskal, determinați un arbore parțial de cost minim.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;kruskalIN.txt&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 linii câte un triplet &amp;lt;code&amp;gt;i j c&amp;lt;/code&amp;gt;, cu semnificația: există muchia...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un graf neorientat ponderat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; muchii – în care fiecare muchie are asociat un cost, număr natural strict pozitiv. Folosind algoritmul lui Kruskal, determinați un arbore parțial de cost minim.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;kruskalIN.txt&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 linii câte un triplet &amp;lt;code&amp;gt;i j c&amp;lt;/code&amp;gt;, cu semnificația: există muchia &amp;lt;code&amp;gt;(i j)&amp;lt;/code&amp;gt; și are 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 de ieșire &amp;lt;code&amp;gt;kruskalOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie costul arborelui de cost minim determinat, iar pe următoarele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; linii câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că muchia &amp;lt;code&amp;gt;(i j)&amp;lt;/code&amp;gt; aparține arborelui parțial de cost minim determinat. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* costul unei muchii va fi mai mic decât &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;kruskalIN.txt&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;
&amp;lt;code&amp;gt;kruskalOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 12&lt;br /&gt;
 3 4&lt;br /&gt;
 4 5&lt;br /&gt;
 1 2&lt;br /&gt;
 2 5&lt;br /&gt;
 2 6&lt;br /&gt;
 2 7&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;kruskalIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 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;
&amp;lt;code&amp;gt;kruskalOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
class Position:&lt;br /&gt;
    def __init__(self, i, j, c):&lt;br /&gt;
        self.i = i&lt;br /&gt;
        self.j = j&lt;br /&gt;
        self.c = c&lt;br /&gt;
&lt;br /&gt;
def union(parent, a, b):&lt;br /&gt;
    parent[a] = parent[b]&lt;br /&gt;
&lt;br /&gt;
def find(parent, a):&lt;br /&gt;
    if a == parent[a]:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        parent[a] = find(parent, parent[a])&lt;br /&gt;
        return parent[a]&lt;br /&gt;
&lt;br /&gt;
def kruskal(n, m, graph, fout):&lt;br /&gt;
    parent = [i for i in range(n + 1)]&lt;br /&gt;
    result = 0&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    A = []&lt;br /&gt;
&lt;br /&gt;
    for edge in graph:&lt;br /&gt;
        r1 = find(parent, edge.i)&lt;br /&gt;
        r2 = find(parent, edge.j)&lt;br /&gt;
        if r1 != r2:&lt;br /&gt;
            result += edge.c&lt;br /&gt;
            A.append(edge)&lt;br /&gt;
            cnt += 1&lt;br /&gt;
            union(parent, r1, r2)&lt;br /&gt;
&lt;br /&gt;
    fout.write(f&amp;quot;{result}\n&amp;quot;)&lt;br /&gt;
    for edge in A:&lt;br /&gt;
        fout.write(f&amp;quot;{edge.i} {edge.j}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, m, graph):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for edge in graph:&lt;br /&gt;
        if not (edge.c &amp;lt; 1000):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    fin = open(&amp;quot;kruskalIN.txt&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    fout = open(&amp;quot;kruskalOUT.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    n, m = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
    graph = []&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        x, y, w = map(int, fin.readline().split())&lt;br /&gt;
        graph.append(Position(x, y, w))&lt;br /&gt;
&lt;br /&gt;
    graph.sort(key=lambda edge: edge.c)&lt;br /&gt;
&lt;br /&gt;
    if not check_restrictions(n, m, graph):&lt;br /&gt;
        fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        kruskal(n, m, graph, fout)&lt;br /&gt;
&lt;br /&gt;
    fin.close()&lt;br /&gt;
    fout.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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0590_-_Prim&amp;diff=9826</id>
		<title>0590 - Prim</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0590_-_Prim&amp;diff=9826"/>
		<updated>2024-05-18T19:50:44Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerința = Se dă un graf neorientat ponderat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; muchii – în care fiecare muchie are asociat un cost, număr natural strict pozitiv. Folosind algoritmul lui Prim, determinați un arbore parțial de cost minim, cu rădăcina în vârful &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;primIN.txt&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 linii câte un triplet &amp;lt;code&amp;gt;i j c&amp;lt;/code...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un graf neorientat ponderat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; muchii – în care fiecare muchie are asociat un cost, număr natural strict pozitiv. Folosind algoritmul lui Prim, determinați un arbore parțial de cost minim, cu rădăcina în vârful &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;primIN.txt&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 linii câte un triplet &amp;lt;code&amp;gt;i j c&amp;lt;/code&amp;gt;, cu semnificația: există muchia &amp;lt;code&amp;gt;(i j)&amp;lt;/code&amp;gt; și are 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 de ieșire &amp;lt;code&amp;gt;primOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie costul arborelui de cost minim determinat, iar pe a doua linie vectorul de tați al arborelui, cu elementele separate prin exact un spațiu. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* costul unei muchii va fi mai mic decât &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;primIN.txt&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;
&amp;lt;code&amp;gt;primOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 12&lt;br /&gt;
 0 1 4 5 2 2 2 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;primIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 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;
&amp;lt;code&amp;gt;primOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, edges):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for x, y, c in edges:&lt;br /&gt;
        if c &amp;gt;= 1000:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;primIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile:&lt;br /&gt;
        n, m = map(int, infile.readline().strip().split())&lt;br /&gt;
        edges = []&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y, c = map(int, infile.readline().strip().split())&lt;br /&gt;
            edges.append((x, y, c))&lt;br /&gt;
&lt;br /&gt;
    if not check_restrictions(n, edges):&lt;br /&gt;
        with open(&amp;quot;primOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    G = [[] for _ in range(n + 1)]&lt;br /&gt;
    for x, y, c in edges:&lt;br /&gt;
        G[x].append((c, y))&lt;br /&gt;
        G[y].append((c, x))&lt;br /&gt;
&lt;br /&gt;
    V = [False] * (n + 1)&lt;br /&gt;
    T = [-1] * (n + 1)&lt;br /&gt;
    D = [float(&#039;inf&#039;)] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    Q = []&lt;br /&gt;
    V[1] = True&lt;br /&gt;
    T[1] = 0&lt;br /&gt;
    D[1] = 0&lt;br /&gt;
&lt;br /&gt;
    for c, y in G[1]:&lt;br /&gt;
        T[y] = 1&lt;br /&gt;
        D[y] = c&lt;br /&gt;
        heapq.heappush(Q, (c, y))&lt;br /&gt;
&lt;br /&gt;
    S = 0&lt;br /&gt;
    for k in range(1, n):&lt;br /&gt;
        while V[Q[0][1]]:&lt;br /&gt;
            heapq.heappop(Q)&lt;br /&gt;
        c, u = heapq.heappop(Q)&lt;br /&gt;
        V[u] = True&lt;br /&gt;
        S += c&lt;br /&gt;
        for cost, v in G[u]:&lt;br /&gt;
            if not V[v] and D[v] &amp;gt; cost:&lt;br /&gt;
                T[v] = u&lt;br /&gt;
                D[v] = cost&lt;br /&gt;
                heapq.heappush(Q, (cost, v))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;primOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
        outfile.write(f&amp;quot;{S}\n&amp;quot;)&lt;br /&gt;
        outfile.write(&amp;quot; &amp;quot;.join(map(str, T[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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1330_-_ParitiiMultime&amp;diff=9825</id>
		<title>1330 - ParitiiMultime</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1330_-_ParitiiMultime&amp;diff=9825"/>
		<updated>2024-05-18T19:44:29Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerința = Fie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; un număr natural nenul și mulțimea &amp;lt;code&amp;gt;A={1,2,3,...,n}&amp;lt;/code&amp;gt;. Să se determine toate partițiile disjuncte ale mulțimii &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;.  O partiție a mulțimii &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; este formată din &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1 ≤ m ≤ n&amp;lt;/code&amp;gt;) submulțimi disjuncte ale lui &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;A1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;Am&amp;lt;/code&amp;gt; cu proprietatea că &amp;lt;code&amp;gt;A=A1U A2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;U...U Am&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de int...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Fie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; un număr natural nenul și mulțimea &amp;lt;code&amp;gt;A={1,2,3,...,n}&amp;lt;/code&amp;gt;. Să se determine toate partițiile disjuncte ale mulțimii &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O partiție a mulțimii &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; este formată din &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1 ≤ m ≤ n&amp;lt;/code&amp;gt;) submulțimi disjuncte ale lui &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;A1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;Am&amp;lt;/code&amp;gt; cu proprietatea că &amp;lt;code&amp;gt;A=A1U A2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;U...U Am&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;partitiimultimeIN.txt&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;partitiimultimeOUT.txt&amp;lt;/code&amp;gt; va conține câte o linie pentru fiecare partiție determinată. Submulțimile vor fi separate în fiecare linie cu ajutorul caracterului &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, iar elementele fiecărei submulțimi se vor scrie fără spațiere, ca în exemplul de mai jos.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 9&amp;lt;/code&amp;gt;&lt;br /&gt;
* Partițiile determinate se vor afișa în ordine lexicografică&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;partitiimultimeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;code&amp;gt;partitiimultimeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 123*&lt;br /&gt;
 12*3*&lt;br /&gt;
 13*2*&lt;br /&gt;
 1*23*&lt;br /&gt;
 1*2*3*&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Sunt determinate &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; partiții distincte ale mulțimii &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;{1,2,3}&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;{1,2} U {3}&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;{1,3} U {2}&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;{1} U {2,3}&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;{1} U {2} U {3}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;partitiimultimeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10&lt;br /&gt;
&amp;lt;code&amp;gt;partitiimultimeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def maxim(k, x):&lt;br /&gt;
    z = 0&lt;br /&gt;
    for i in range(1, k):&lt;br /&gt;
        z = max(x[i], z)&lt;br /&gt;
    return z&lt;br /&gt;
&lt;br /&gt;
def scrie(x, n, g):&lt;br /&gt;
    z = maxim(n + 1, x)&lt;br /&gt;
    for i in range(1, z + 1):&lt;br /&gt;
        for j in range(1, n + 1):&lt;br /&gt;
            if x[j] == i:&lt;br /&gt;
                g.write(str(j))&lt;br /&gt;
        g.write(&amp;quot;*&amp;quot;)&lt;br /&gt;
    g.write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def back(k, n, x, g):&lt;br /&gt;
    if k == n + 1:&lt;br /&gt;
        scrie(x, n, g)&lt;br /&gt;
    else:&lt;br /&gt;
        for i in range(1, maxim(k, x) + 2):&lt;br /&gt;
            x[k] = i&lt;br /&gt;
            back(k + 1, n, x, g)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, g):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 9):&lt;br /&gt;
        g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;partitiimultimeIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;partitiimultimeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        if verifica_restrictii(n, g):&lt;br /&gt;
            x = [0] * (n + 1)&lt;br /&gt;
            x[1] = 1&lt;br /&gt;
            back(2, n, x, g)&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3153_-_eliminaren&amp;diff=9824</id>
		<title>3153 - eliminaren</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3153_-_eliminaren&amp;diff=9824"/>
		<updated>2024-05-18T19:34:49Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerința = Se citesc de la tastatură un cuvânt &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; format din litere mici distincte și un număr natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Să se afișeze pe ecran toate cuvintele care se pot obține din &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; eliminând exact &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere.  Eliminarea se face începând cu literele de la sfârșitul cuvântului, iar ordinea din cuvânt a literelor nu se schimbă (vezi explicația din exemplu).  = Date de intrare = Programul citește de la tastatură cuvântul...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se citesc de la tastatură un cuvânt &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; format din litere mici distincte și un număr natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Să se afișeze pe ecran toate cuvintele care se pot obține din &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; eliminând exact &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere.&lt;br /&gt;
&lt;br /&gt;
Eliminarea se face începând cu literele de la sfârșitul cuvântului, iar ordinea din cuvânt a literelor nu se schimbă (vezi explicația din exemplu).&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;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 pe rânduri separate cuvintele care se pot obține din &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; eliminând exact &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* Cuvântul &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; are cel mult &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; de litere&lt;br /&gt;
* Cuvântul &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; este format din litere mici distincte&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt;=  n &amp;lt;&amp;lt;/code&amp;gt; numărul de litere ale lui &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 dorel 2&lt;br /&gt;
Ieșire&lt;br /&gt;
 dor&lt;br /&gt;
 doe&lt;br /&gt;
 dol&lt;br /&gt;
 dre&lt;br /&gt;
 drl&lt;br /&gt;
 del&lt;br /&gt;
 ore&lt;br /&gt;
 orl&lt;br /&gt;
 oel&lt;br /&gt;
 rel&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Din cele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; litere se elimina două, astfel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dor&amp;lt;/code&amp;gt; – se elimina a &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;-a si a &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;-a litera&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doe&amp;lt;/code&amp;gt; – se elimina a &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;-a si a &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;-a litera&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dol&amp;lt;/code&amp;gt; – se elimina a &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;-a si a &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;-a litera&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dre&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;drl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;del&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ore&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;orl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;oel&amp;lt;/code&amp;gt; – se elimina prima si a &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;-a litera&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt; – se elimina prima si a &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;-a litera&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def afisare(s, x, n, c):&lt;br /&gt;
    rezultat = &#039;&#039;.join(s[x[i] - 1] for i in range(1, n - c + 1))&lt;br /&gt;
    print(rezultat)&lt;br /&gt;
&lt;br /&gt;
def bectreching(k, s, x, n, c):&lt;br /&gt;
    for i in range(x[k - 1] + 1, n + 1):&lt;br /&gt;
        x[k] = i&lt;br /&gt;
        if k &amp;lt; n - c:&lt;br /&gt;
            bectreching(k + 1, s, x, n, c)&lt;br /&gt;
        else:&lt;br /&gt;
            afisare(s, x, n, c)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(s, c):&lt;br /&gt;
    if len(s) &amp;gt; 20 or not s.islower() or len(s) != len(set(s)) or not (1 &amp;lt;= c &amp;lt; len(s)):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    intrare = input().strip().split()&lt;br /&gt;
    s = intrare[0]&lt;br /&gt;
    c = int(intrare[1])&lt;br /&gt;
    if not verifica_restrictii(s, c):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    n = len(s)&lt;br /&gt;
    x = [0] * (n + 1)&lt;br /&gt;
    bectreching(1, s, x, n, c)&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3347_-_Fibonacci3&amp;diff=9823</id>
		<title>3347 - Fibonacci3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3347_-_Fibonacci3&amp;diff=9823"/>
		<updated>2024-05-18T19:29:20Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerința = Se dă un şir format din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale. Se calculează suma elementelor oricărui subşir al şirului dat. Să se afle câte din sumele obţinute sunt termeni ai şirului lui Fibonacci.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;fibonacci3IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe următoarea linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale.  = Date de ieșire = Fișierul de ieșire &amp;lt;code&amp;gt;fibonacci3OUT.txt&amp;lt;/code&amp;gt; va conține...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un şir format din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale. Se calculează suma elementelor oricărui subşir al şirului dat. Să se afle câte din sumele obţinute sunt termeni ai şirului lui Fibonacci.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;fibonacci3IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe următoarea linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;fibonacci3OUT.txt&amp;lt;/code&amp;gt; va conține numărul sumelor care sunt termeni ai şirului lui Fibonacci. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ n ≤ 25&amp;lt;/code&amp;gt;&lt;br /&gt;
* numerele date sunt cel mult egale cu &amp;lt;code&amp;gt;1017&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;fibonacci3IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 3 18&lt;br /&gt;
&amp;lt;code&amp;gt;fibonacci3OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Sumele obţinute sunt &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt;, dintre care &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; sunt termeni ai [[Fibonacci number|şirului lui Fibonacci]].&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;fibonacci3IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 3 18&lt;br /&gt;
&amp;lt;code&amp;gt;fibonacci3OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
NMAX = 2500000000000000225&lt;br /&gt;
&lt;br /&gt;
def gen_fibo():&lt;br /&gt;
    fibonacci = [0, 1]&lt;br /&gt;
    x, y = 1, 1&lt;br /&gt;
    while x + y &amp;lt; NMAX:&lt;br /&gt;
        z = x + y&lt;br /&gt;
        fibonacci.append(z)&lt;br /&gt;
        y = x&lt;br /&gt;
        x = z&lt;br /&gt;
    return fibonacci&lt;br /&gt;
&lt;br /&gt;
def cauta(fibonacci, valoare):&lt;br /&gt;
    st, dr = 0, len(fibonacci) - 1&lt;br /&gt;
    while st &amp;lt;= dr:&lt;br /&gt;
        mij = (st + dr) // 2&lt;br /&gt;
        if fibonacci[mij] == valoare:&lt;br /&gt;
            return True&lt;br /&gt;
        if valoare &amp;lt; fibonacci[mij]:&lt;br /&gt;
            dr = mij - 1&lt;br /&gt;
        else:&lt;br /&gt;
            st = mij + 1&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def bkt(k, s, n, v, fibonacci):&lt;br /&gt;
    global nr&lt;br /&gt;
    if cauta(fibonacci, s):&lt;br /&gt;
        nr += 1&lt;br /&gt;
    if k &amp;lt; n:&lt;br /&gt;
        for i in range(k + 1, n + 1):&lt;br /&gt;
            bkt(i, s + v[i - 1], n, v, fibonacci)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, v):&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 25):&lt;br /&gt;
        return False&lt;br /&gt;
    if any(x &amp;gt; 10**17 for x in v):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global nr&lt;br /&gt;
    nr = 0&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;fibonacci3IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        v = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;fibonacci3OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        if not verifica_restrictii(n, v):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        fibonacci = gen_fibo()&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            bkt(i, v[i - 1], n, v, fibonacci)&lt;br /&gt;
        fout.write(str(nr))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1278_-_ProdusCartezian2&amp;diff=9822</id>
		<title>1278 - ProdusCartezian2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1278_-_ProdusCartezian2&amp;diff=9822"/>
		<updated>2024-05-18T19:25:33Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerinţa = Se dau &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; mulțimi:  * A1={1,2,...,v1} * A2={1,2,...,v2} * .. * An={1,2,...,vn}  Să se genereze în ordine lexicografică elementele produsului cartezian .  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;produscartezian2IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale nenule &amp;lt;code&amp;gt;v[1] v[2] ... v[n]&amp;lt;/code&amp;gt;.  = Date de ieşire = Fișierul de ieșire &amp;lt;code&amp;gt;produscartezian2OUt.txt&amp;lt;/code&amp;gt; v...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dau &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; mulțimi:&lt;br /&gt;
&lt;br /&gt;
* A1={1,2,...,v1}&lt;br /&gt;
* A2={1,2,...,v2}&lt;br /&gt;
* ..&lt;br /&gt;
* An={1,2,...,vn}&lt;br /&gt;
&lt;br /&gt;
Să se genereze în ordine lexicografică elementele produsului cartezian .&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;produscartezian2IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale nenule &amp;lt;code&amp;gt;v[1] v[2] ... v[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;produscartezian2OUt.txt&amp;lt;/code&amp;gt; va conține elementele produsului cartezian, fiecare pe o linie. Valorile de pe fiecare linie vor fi separate prin câte un spațiu. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricţii şi precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ v[i] ≤ 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;produscartezian2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 2 1 3&lt;br /&gt;
&amp;lt;code&amp;gt;produscartezian2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 1 1 &lt;br /&gt;
 1 1 2 &lt;br /&gt;
 1 1 3 &lt;br /&gt;
 2 1 1 &lt;br /&gt;
 2 1 2 &lt;br /&gt;
 2 1 3 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;produscartezian2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10&lt;br /&gt;
 2 1 3&lt;br /&gt;
&amp;lt;code&amp;gt;produscartezian2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citire():&lt;br /&gt;
    with open(&amp;quot;produscartezian2IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        v = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
    return n, v&lt;br /&gt;
&lt;br /&gt;
def afisare(x, fout):&lt;br /&gt;
    fout.write(&amp;quot; &amp;quot;.join(map(str, x)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def backtracking(k, n, v, x, fout):&lt;br /&gt;
    if k &amp;gt; n:&lt;br /&gt;
        afisare(x, fout)&lt;br /&gt;
    else:&lt;br /&gt;
        for i in range(1, v[k-1] + 1):&lt;br /&gt;
            x[k-1] = i&lt;br /&gt;
            backtracking(k + 1, n, v, x, fout)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, v):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 7 and all(1 &amp;lt;= vi &amp;lt;= 7 for vi in v):&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, v = citire()&lt;br /&gt;
    with open(&amp;quot;produscartezian2OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        if verifica_restrictii(n, v):&lt;br /&gt;
            x = [0] * n&lt;br /&gt;
            backtracking(1, n, v, x, fout)&lt;br /&gt;
        else:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1277_-_ProdusCartezian1&amp;diff=9821</id>
		<title>1277 - ProdusCartezian1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1277_-_ProdusCartezian1&amp;diff=9821"/>
		<updated>2024-05-18T19:18:57Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Cerinţa = Se dau două numere naturale nenule &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Considerăm mulțimea &amp;lt;code&amp;gt;A={1,2,..,n}&amp;lt;/code&amp;gt;. Să se genereze în ordine lexicografică elementele produsului cartezian .  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;produscartezian1IN.txt&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;, separate printr-un spațiu.  = Date de ieşire = Fișierul de ieșire &amp;lt;code&amp;gt;produscartezian1OUT.txt&amp;lt;/code&amp;gt; va conține elemen...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dau două numere naturale nenule &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Considerăm mulțimea &amp;lt;code&amp;gt;A={1,2,..,n}&amp;lt;/code&amp;gt;. Să se genereze în ordine lexicografică elementele produsului cartezian .&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;produscartezian1IN.txt&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;, separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;produscartezian1OUT.txt&amp;lt;/code&amp;gt; va conține elementele produsului cartezian, fiecare pe o linie. Valorile de pe fiecare linie vor fi separate prin câte un spațiu. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricţii şi precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤ 6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;produscartezian1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 3&lt;br /&gt;
&amp;lt;code&amp;gt;produscartezian1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 1 1 &lt;br /&gt;
 1 1 2 &lt;br /&gt;
 1 2 1 &lt;br /&gt;
 1 2 2 &lt;br /&gt;
 2 1 1 &lt;br /&gt;
 2 1 2 &lt;br /&gt;
 2 2 1 &lt;br /&gt;
 2 2 2 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;produscartezian1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 8&lt;br /&gt;
&amp;lt;code&amp;gt;produscartezian1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def afisare(x, m, out_file):&lt;br /&gt;
    with open(out_file, &#039;a&#039;) as f:&lt;br /&gt;
        for i in range(1, m + 1):&lt;br /&gt;
            f.write(f&amp;quot;{x[i]} &amp;quot;)&lt;br /&gt;
        f.write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def bectreching(k, n, m, x, out_file):&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        x[k] = i&lt;br /&gt;
        if k &amp;lt; m:&lt;br /&gt;
            bectreching(k + 1, n, m, x, out_file)&lt;br /&gt;
        else:&lt;br /&gt;
            afisare(x, m, out_file)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, m):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 7 and 1 &amp;lt;= m &amp;lt;= 6:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;produscartezian1IN.txt&amp;quot;, &#039;r&#039;) as infile:&lt;br /&gt;
        n, m = map(int, infile.readline().strip().split())&lt;br /&gt;
&lt;br /&gt;
    if verifica_restrictii(n, m):&lt;br /&gt;
        x = [0] * (m + 1)&lt;br /&gt;
        out_file = &amp;quot;produscartezian1OUT.txt&amp;quot;&lt;br /&gt;
        with open(out_file, &#039;w&#039;):  # Clear the output file&lt;br /&gt;
            pass&lt;br /&gt;
        bectreching(1, n, m, x, out_file)&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;produscartezian1OUT.txt&amp;quot;, &#039;w&#039;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1354_-_varf&amp;diff=9820</id>
		<title>1354 - varf</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1354_-_varf&amp;diff=9820"/>
		<updated>2024-05-18T19:11:57Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: Pagină nouă: = Enunț = Se consideră un şir &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale distincte: &amp;lt;code&amp;gt;a1, a2,..., an&amp;lt;/code&amp;gt;.  Eliminând &amp;lt;code&amp;gt;n-k&amp;lt;/code&amp;gt; numere din șirul a vom obține un subșir de lungime &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; al șirului &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.  Definim subșir &amp;lt;code&amp;gt;vârf&amp;lt;/code&amp;gt; de lungime &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; al șirului &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; un subșir &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; cu proprietatea că acesta conține un număr &amp;lt;code&amp;gt;xi&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1&amp;lt;i&amp;lt;k&amp;lt;/code&amp;gt;) astfel încât:  &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt; &amp;lt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Enunț =&lt;br /&gt;
Se consideră un şir &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale distincte: &amp;lt;code&amp;gt;a1, a2,..., an&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Eliminând &amp;lt;code&amp;gt;n-k&amp;lt;/code&amp;gt; numere din șirul a vom obține un subșir de lungime &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; al șirului &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Definim subșir &amp;lt;code&amp;gt;vârf&amp;lt;/code&amp;gt; de lungime &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; al șirului &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; un subșir &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; cu proprietatea că acesta conține un număr &amp;lt;code&amp;gt;xi&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1&amp;lt;i&amp;lt;k&amp;lt;/code&amp;gt;) astfel încât:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt; x2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt; … &amp;lt; xi-1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt; xi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;gt; xi+1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;gt; … &amp;gt; xk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se genereze toate subşirurile &amp;lt;code&amp;gt;vârf&amp;lt;/code&amp;gt; ale şirului &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, de lungime minim &amp;lt;code&amp;gt;3&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;varfIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale distincte separate prin câte un spațiu, reprezentând numerele din șirul &amp;lt;code&amp;gt;a&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;varfOUT.txt&amp;lt;/code&amp;gt; va conține pe fiecare linie câte un subșir &amp;lt;code&amp;gt;vârf&amp;lt;/code&amp;gt;, în ordinea lexicografică a pozițiilor ocupate în șirul &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; de termenii subșirului. Numerele din fiecare linie vor fi separate prin câte un spațiu. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;4 ≤ n ≤ 11&amp;lt;/code&amp;gt;&lt;br /&gt;
* numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt;&lt;br /&gt;
* subșirurile &amp;lt;code&amp;gt;vârf&amp;lt;/code&amp;gt; vor fi scrise în fișier în ordinea lexicografică a pozițiilor ocupate în șirul &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; de termenii fiecărui subșir.&lt;br /&gt;
* dacă nu există niciun subșir &amp;lt;code&amp;gt;vârf&amp;lt;/code&amp;gt; atunci fișierul de ieșire &amp;lt;code&amp;gt;varf.out&amp;lt;/code&amp;gt; va conține pe prima linie valoarea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;varfIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 2 1 4 3&lt;br /&gt;
&amp;lt;code&amp;gt;varfOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 4 3 &lt;br /&gt;
 1 4 3 &lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Se pot construi doar două subșiruri &amp;lt;code&amp;gt;vârf&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;(2,4,3)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(1,4,3)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;varfIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 2 1 4 3&lt;br /&gt;
&amp;lt;code&amp;gt;varfOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def afisare(k, fout, x, b):&lt;br /&gt;
    for i in range(1, k + 1):&lt;br /&gt;
        fout.write(str(x[b[i]]) + &amp;quot; &amp;quot;)&lt;br /&gt;
    fout.write(&#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def solutie(k, x, b):&lt;br /&gt;
    if k &amp;gt;= 3:&lt;br /&gt;
        st, dr = 1, k&lt;br /&gt;
        while x[b[st]] &amp;lt; x[b[st + 1]]:&lt;br /&gt;
            st += 1&lt;br /&gt;
        while x[b[dr]] &amp;lt; x[b[dr - 1]]:&lt;br /&gt;
            dr -= 1&lt;br /&gt;
        if st != dr:&lt;br /&gt;
            return False&lt;br /&gt;
        if st == 1 or dr == k or st == k or dr == 1:&lt;br /&gt;
            return False&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def bkt(k, n, x, b, fout, ok):&lt;br /&gt;
    for i in range(b[k - 1] + 1, n + 1):&lt;br /&gt;
        b[k] = i&lt;br /&gt;
        if k &amp;gt;= 3 and solutie(k, x, b):&lt;br /&gt;
            afisare(k, fout, x, b)&lt;br /&gt;
            ok[0] = 1&lt;br /&gt;
        bkt(k + 1, n, x, b, fout, ok)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;varfIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        x = [0] + list(map(int, fin.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    if not (4 &amp;lt;= n &amp;lt;= 11) or any(num &amp;gt;= 20 for num in x[1:]):&lt;br /&gt;
        with open(&amp;quot;varfOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    b = [0] * 30&lt;br /&gt;
    ok = [0]&lt;br /&gt;
    with open(&amp;quot;varfOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        bkt(1, n, x, b, fout, ok)&lt;br /&gt;
        if ok[0] == 0:&lt;br /&gt;
            fout.write(&amp;quot;0&amp;quot;)&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2676_-_Afise&amp;diff=9819</id>
		<title>2676 - Afise</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2676_-_Afise&amp;diff=9819"/>
		<updated>2024-05-18T17:19:08Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Campania electorală s-a terminat de mult, dar zidul din parcul central al oraşului în care au fost puse afişele este încă într-o formă dezolantă. Ploile şi vântul au acţionat şi au urâţit şi mai mult această zonă pe care altă dată erau afişe frumos colorate. Primăria a decis să se ocupe de această problemă. A format o comisie şi a decis realizarea unor panouri reclamă care să ascundă porţiunile deteriorate. Deoarece fondurile sunt mici s-a decis să fie alocate doar un anumit număr de panouri publicitare care trebuie să ocupe o suprafaţă cât mai mică posibil. Comisia a primit datele din teren sub forma: lungime zid, câte unităţi sunt ocupate cu afişe ce trebuie acoperite şi care este numărul de panouri pe care le poate folosi. De asemenea se primesc ca date şi care sunt unităţile de zid ocupate cu afişe deja deteriorate.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind date lungimea zidului, câte unităţi sunt deteriorate, care este numărul maxim de panouri ce pot fi folosite şi care sunt unităţile de zid deteriorate, se cere să se determine lungimea minimă totală a panourilor care sunt folosite pentru a acoperi zona şi câte panouri se folosesc. Lungimea minimă o definim ca numărul total de unităţi de zid acoperite astfel încât să fie mascate zonele problemă. Pentru acoperirea unităţilor de zid deteriorate, nu este neapărat necesar să se folosească toate panourile. Numărul de panouri folosite fiind limitat există posibilitatea să fie acoperite şi zone din zid care sunt curate.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;afiseIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie trei valori separate prin câte un spaţiu &amp;lt;code&amp;gt;L n k&amp;lt;/code&amp;gt;, cu semnificația: &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; lungimea totală a zidului, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numărul de unităţi ce urmează a fi acoperite şi &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; numărul maxim de panouri ce pot fi folosite. Pe a doua linie separate prin câte un spațiu sunt &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;, … , &amp;lt;code&amp;gt;xn&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;xi&amp;lt;/code&amp;gt; reprezintă unitatea din zid care este acoperită de un afiș vechi. Valorile &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;, … , &amp;lt;code&amp;gt;xn&amp;lt;/code&amp;gt; apar într-o ordine aleatoare.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;afiseOUT.txt&amp;lt;/code&amp;gt; va conține o singură linie cu două valori &amp;lt;code&amp;gt;val Nk&amp;lt;/code&amp;gt;, ce reprezintă lungimea minimă totală folosită și numărul de panouri folosite astfel încât toate zonele deteriorate să fie acoperite. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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; L ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; n ≤ L&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; k ≤ L / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;afiseIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 25 8 3&lt;br /&gt;
 3 11 6 4 19 15 20 12&lt;br /&gt;
&amp;lt;code&amp;gt;afiseOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 11 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Zidul are lungimea egală cu &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; de unități, iar &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; dintre ele conțin afișe care trebuiesc acoperite cu maximum &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; panouri. Se vor folosi toate cele &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; panouri care vor totaliza &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; unități, acoperind zonele &amp;lt;code&amp;gt;3-6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;11-15&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;19-20&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Caracterul &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; reprezintă unitățile de zid acoperite de afișe vechi&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;afiseIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10 4 5&lt;br /&gt;
 7 3 8 1&lt;br /&gt;
&amp;lt;code&amp;gt;afiseOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 3&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(l, n, k):&lt;br /&gt;
    if not (0 &amp;lt; l &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt; n &amp;lt;= l):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt; k &amp;lt;= l / 2):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;afiseIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile:&lt;br /&gt;
        l, n, k = map(int, infile.readline().split())&lt;br /&gt;
        x_values = list(map(int, infile.readline().split()))&lt;br /&gt;
    &lt;br /&gt;
    if not verifica_restrictii(l, n, k):&lt;br /&gt;
        with open(&amp;quot;afiseOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    v = [0] * (l + 1)&lt;br /&gt;
    for x in x_values:&lt;br /&gt;
        v[x] = 1&lt;br /&gt;
    &lt;br /&gt;
    val = 0&lt;br /&gt;
    n1 = 0&lt;br /&gt;
    n2 = 0&lt;br /&gt;
    v1 = [0] * 1010&lt;br /&gt;
    v2 = [0] * 1010&lt;br /&gt;
&lt;br /&gt;
    i = 1&lt;br /&gt;
    while i &amp;lt;= l:&lt;br /&gt;
        if not v[i] and not n1:&lt;br /&gt;
            i += 1&lt;br /&gt;
        else:&lt;br /&gt;
            if not v[i]:&lt;br /&gt;
                n2 += 1&lt;br /&gt;
                while i &amp;lt;= l and not v[i]:&lt;br /&gt;
                    v2[n2] += 1&lt;br /&gt;
                    i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                n1 += 1&lt;br /&gt;
                while i &amp;lt;= l and v[i] == 1:&lt;br /&gt;
                    v1[n1] += 1&lt;br /&gt;
                    i += 1&lt;br /&gt;
                    val += 1&lt;br /&gt;
&lt;br /&gt;
    if not v[l]:&lt;br /&gt;
        n2 -= 1&lt;br /&gt;
&lt;br /&gt;
    v2 = sorted(v2[1:n2 + 1])&lt;br /&gt;
    &lt;br /&gt;
    if n1 &amp;gt; k:&lt;br /&gt;
        nk = k&lt;br /&gt;
        for i in range(n1 - k):&lt;br /&gt;
            val += v2[i]&lt;br /&gt;
    else:&lt;br /&gt;
        nk = n1&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;afiseOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
        outfile.write(f&amp;quot;{val} {nk}&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1225_-_Sort_2_Dist&amp;diff=9818</id>
		<title>1225 - Sort 2 Dist</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1225_-_Sort_2_Dist&amp;diff=9818"/>
		<updated>2024-05-18T17:10:17Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Jocul pe care îl joaca Robo atunci când se plictisește este un joc inteligent pentru roboței. Pe ecranul tabletei lui roboțești, sunt &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; căsuțe de formă pătrată, cu latura egală cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Căsuțele sunt așezate pe un rând, una lângă alta, fiind etichetate, în această ordine, cu numere 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;. Fiecare căsuță conține câte un număr natural, identificatorul câte unuia dintre prietenii săi, roboței, ca și el. Identificatorii se pot repeta.&lt;br /&gt;
&lt;br /&gt;
Robo poate interschimba conținutul a două căsuțe, numai dacă distanța dintre centrele acestora pe orizontală este egală cu distanța dintre brațele sale; distanța, pe orizontală, dintre centrele a două căsuțe etichetate cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, respectiv cu &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, este &amp;lt;code&amp;gt;j-i&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1≤i&amp;lt;j≤N&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
El își poate fixa în orice moment distanța dintre brațe la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau își poate dubla distanța curentă dintre brațe, de oricâte ori este necesar, fără a depăși valoarea &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt;. Astfel, distanța dintre brațele sale poate fi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, apoi, prin dublare, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, apoi, prin dublare &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, apoi, prin dublare &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; etc. La începutul jocului, distanța dintre brațele lui Robo este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. De fiecare dată când consideră convenabilă distanța dintre brațe, realizează o interschimbare.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se cere ca Robo să așeze identificatorii în căsuțe în ordine crescătoare, prin maximum &amp;lt;code&amp;gt;12500&amp;lt;/code&amp;gt; interschimbări de tipul celei precizate mai sus.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;sort2distIN.txt&amp;lt;/code&amp;gt; conține:&lt;br /&gt;
&lt;br /&gt;
* pe prima linie numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, cu semnificația din enunț;&lt;br /&gt;
* pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere, reprezentând, în această ordine, identificatorii aflați în căsuțele tabletei (identificatorul de pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; se află în căsuța &amp;lt;code&amp;gt;i-1&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;sort2distOUT.txt&amp;lt;/code&amp;gt; va conține:&lt;br /&gt;
&lt;br /&gt;
* pe prima linie un număr natural &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul de interschimbări realizate de Robo (nu neapărat numărul minim de interschimbări necesare);&lt;br /&gt;
* pe fiecare dintre următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii (doar dacă &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; este nenul), câte două numere naturale, separate prin câte un spațiu, reprezentând etichetele căsuțelor al căror conținut s-a interschimbat, în ordinea realizării acestor interschimbări. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* identificatorii sunt numere naturale de maximum &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de cifre;&lt;br /&gt;
* pentru 25% din punctaj, fișierele de test conțin numere cu maximum &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; cifre;&lt;br /&gt;
* pentru 25% din punctaj, &amp;lt;code&amp;gt;N ≤ 100&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 : =&lt;br /&gt;
&amp;lt;code&amp;gt;sort2distIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 5&lt;br /&gt;
 7&lt;br /&gt;
 6&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;code&amp;gt;sort2distOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 2 4&lt;br /&gt;
 2 1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Tableta are &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; căsuțe, conținând, în această ordine, identificatorii &amp;lt;code&amp;gt;(5,7,6,2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pentru ordonarea crescătoare s-au realizat &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; interschimbări:&lt;br /&gt;
&lt;br /&gt;
* s-a interschimbat conținutul căsuțelor &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; (distanța dintre centrele lor fiind &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), identificatorii din căsuțe fiind acum &amp;lt;code&amp;gt;(5, 2, 6, 7)&amp;lt;/code&amp;gt;;&lt;br /&gt;
* s-a interschimbat conținutul căsuțelor &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; (distanța dintre centrele lor fiind &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), identificatorii din căsuțe fiind acum &amp;lt;code&amp;gt;(2, 5, 6, 7)&amp;lt;/code&amp;gt;, ordonați crescător.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 : ==&lt;br /&gt;
&amp;lt;code&amp;gt;sort2distIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001&lt;br /&gt;
 5&lt;br /&gt;
 7&lt;br /&gt;
 6&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;code&amp;gt;sort2distOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
DIM = 1010&lt;br /&gt;
&lt;br /&gt;
sol = []&lt;br /&gt;
v = [0] * DIM&lt;br /&gt;
s = [&amp;quot;&amp;quot;] * DIM&lt;br /&gt;
aux = &amp;quot;&amp;quot;&lt;br /&gt;
w = [&amp;quot;&amp;quot;] * DIM&lt;br /&gt;
&lt;br /&gt;
def myStrcmp(s1, s2):&lt;br /&gt;
    if len(s1) == len(s2):&lt;br /&gt;
        return (s1 &amp;gt; s2) - (s1 &amp;lt; s2)&lt;br /&gt;
    else:&lt;br /&gt;
        return -1 if len(s1) &amp;lt; len(s2) else 1&lt;br /&gt;
&lt;br /&gt;
def schimba(x, y):&lt;br /&gt;
    sol.append((x, y))&lt;br /&gt;
    aux = v[x]&lt;br /&gt;
    v[x] = v[y]&lt;br /&gt;
    v[y] = aux&lt;br /&gt;
&lt;br /&gt;
def verify_restrictions(n, strings):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    for string in strings:&lt;br /&gt;
        if not (1 &amp;lt;= len(string) &amp;lt;= 30):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;sort2distIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            s[i] = fin.readline().strip()&lt;br /&gt;
            w[i] = s[i]&lt;br /&gt;
&lt;br /&gt;
    if not verify_restrictions(n, s[1:n+1]):&lt;br /&gt;
        with open(&amp;quot;sort2distOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        for j in range(i + 1, n + 1):&lt;br /&gt;
            if myStrcmp(w[i], w[j]) &amp;gt; 0:&lt;br /&gt;
                w[i], w[j] = w[j], w[i]&lt;br /&gt;
&lt;br /&gt;
    k = 1&lt;br /&gt;
    for i in range(2, n + 1):&lt;br /&gt;
        if myStrcmp(w[i], w[k]) != 0:&lt;br /&gt;
            k += 1&lt;br /&gt;
            w[k] = w[i]&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        st = 1&lt;br /&gt;
        dr = k&lt;br /&gt;
        while st &amp;lt;= dr:&lt;br /&gt;
            mid = (st + dr) // 2&lt;br /&gt;
            if myStrcmp(s[i], w[mid]) == 0:&lt;br /&gt;
                v[i] = mid&lt;br /&gt;
                break&lt;br /&gt;
            if myStrcmp(s[i], w[mid]) &amp;lt; 0:&lt;br /&gt;
                dr = mid - 1&lt;br /&gt;
            else:&lt;br /&gt;
                st = mid + 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(n, 1, -1):&lt;br /&gt;
        m = v[1]&lt;br /&gt;
        p = 1&lt;br /&gt;
        for j in range(2, i + 1):&lt;br /&gt;
            if v[j] &amp;gt; m:&lt;br /&gt;
                m = v[j]&lt;br /&gt;
                p = j&lt;br /&gt;
        if p != i:&lt;br /&gt;
            d = i - p&lt;br /&gt;
&lt;br /&gt;
            putere = 1&lt;br /&gt;
            last = p&lt;br /&gt;
            while d != 0:&lt;br /&gt;
                if d % 2 == 1:&lt;br /&gt;
                    schimba(last + putere, last)&lt;br /&gt;
                    last += putere&lt;br /&gt;
                d = d // 2&lt;br /&gt;
                putere *= 2&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;sort2distOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{len(sol)}\n&amp;quot;)&lt;br /&gt;
        for x, y in sol:&lt;br /&gt;
            fout.write(f&amp;quot;{x} {y}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3344_-_Fibonacci2&amp;diff=9817</id>
		<title>3344 - Fibonacci2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3344_-_Fibonacci2&amp;diff=9817"/>
		<updated>2024-05-18T17:05:06Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Șirul lui Fibonacci este definit astfel:&lt;br /&gt;
&lt;br /&gt;
Fn={1Fn−1+Fn−2dacă n=1 sau n=2,dacă n&amp;gt;2.&lt;br /&gt;
Se dă un număr natural n. Determinați al n-lea termen al șirului, modulo 666013.&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;F&amp;lt;/code&amp;gt;, reprezentând al &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;-lea termen al șirului, 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 ≤ n ≤ 2.000.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;
Ieșire&lt;br /&gt;
 8&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Termenii sunt: &amp;lt;code&amp;gt;1 1 2 3 5 8 13 21 34 55 89 ...&amp;lt;/code&amp;gt;&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 666013&lt;br /&gt;
&lt;br /&gt;
class Mat:&lt;br /&gt;
    def __init__(self, mat):&lt;br /&gt;
        self.mat = mat&lt;br /&gt;
&lt;br /&gt;
nullMat = Mat([[1, 0], [0, 1]])&lt;br /&gt;
initMat = Mat([[1, 1], [1, 0]])&lt;br /&gt;
&lt;br /&gt;
def prod(a, b):&lt;br /&gt;
    ret = Mat([[0, 0], [0, 0]])&lt;br /&gt;
    ret.mat[0][0] = (a.mat[0][0] * b.mat[0][0] + a.mat[0][1] * b.mat[1][0]) % MOD&lt;br /&gt;
    ret.mat[0][1] = (a.mat[0][0] * b.mat[0][1] + a.mat[0][1] * b.mat[1][1]) % MOD&lt;br /&gt;
    ret.mat[1][0] = (a.mat[1][0] * b.mat[0][0] + a.mat[1][1] * b.mat[1][0]) % MOD&lt;br /&gt;
    ret.mat[1][1] = (a.mat[1][0] * b.mat[0][1] + a.mat[1][1] * b.mat[1][1]) % MOD&lt;br /&gt;
    return ret&lt;br /&gt;
&lt;br /&gt;
def pwr(mat, n):&lt;br /&gt;
    if n == 0:&lt;br /&gt;
        return nullMat&lt;br /&gt;
    if n % 2 == 1:&lt;br /&gt;
        return prod(mat, pwr(prod(mat, mat), n // 2))&lt;br /&gt;
    return pwr(prod(mat, mat), n // 2)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 2000000000:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    if verifica_restrictii(n):&lt;br /&gt;
        result = pwr(initMat, n)&lt;br /&gt;
        print(result.mat[0][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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3785_-_AI&amp;diff=9816</id>
		<title>3785 - AI</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3785_-_AI&amp;diff=9816"/>
		<updated>2024-05-18T17:02:09Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Al Bundy a plecat la serviciu, lăsându-i soţiei lui, Peg, cardul de cumpărături. PIN-ul este valoarea expresiei E(n)=∑nk=1(2⋅(a2+b2)k2⋅cos(k⋅α)), &lt;br /&gt;
unde  α=arctg(ab) , iar n, a, b sunt numere naturale nenule.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se afle valoarea expresiei , modulo &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;alIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n, a, b&amp;lt;/code&amp;gt;, separate prin spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;alOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie valoarea expresiei , modulo &amp;lt;code&amp;gt;1.000.000.007&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 1012&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a , b ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;alIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 5 12&lt;br /&gt;
&amp;lt;code&amp;gt;alOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1918&lt;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Dacă α=arctg(5/12), atunci sin(α)=5/13 şi cos(α)=12/13.&lt;br /&gt;
Avem E(3)=2⋅13⋅cos(α)+2⋅13*2⋅cos(2α)+2⋅13*3⋅cos(3α)=2⋅13⋅12/13+2⋅13*2⋅(2⋅cos2(α)−1)+2⋅13*3⋅(4⋅cos*3(α)−3⋅cos(α))=24+238+1656=1918.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;alIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 21 12&lt;br /&gt;
&amp;lt;code&amp;gt;alOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1000000007&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return (1, 0)&lt;br /&gt;
    else:&lt;br /&gt;
        x, y = gcd(b, a % b)&lt;br /&gt;
        return (y, x - y * (a // b))&lt;br /&gt;
&lt;br /&gt;
def prod(x, y):&lt;br /&gt;
    ret = [[0, 0], [0, 0]]&lt;br /&gt;
    ret[0][0] = (x[0][0] * y[0][0] + x[0][1] * y[1][0]) % MOD&lt;br /&gt;
    ret[0][1] = (x[0][0] * y[0][1] + x[0][1] * y[1][1]) % MOD&lt;br /&gt;
    ret[1][0] = (x[1][0] * y[0][0] + x[1][1] * y[1][0]) % MOD&lt;br /&gt;
    ret[1][1] = (x[1][0] * y[0][1] + x[1][1] * y[1][1]) % MOD&lt;br /&gt;
    return ret&lt;br /&gt;
&lt;br /&gt;
def pwr(mat, n):&lt;br /&gt;
    nullMat = [[1, 0], [0, 1]]&lt;br /&gt;
    if n == 0:&lt;br /&gt;
        return nullMat&lt;br /&gt;
    if n % 2:&lt;br /&gt;
        return prod(mat, pwr(prod(mat, mat), n // 2))&lt;br /&gt;
    return pwr(prod(mat, mat), n // 2)&lt;br /&gt;
&lt;br /&gt;
def verify_restrictions(n, a, b):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 1012 and 1 &amp;lt;= a &amp;lt;= 20 and 1 &amp;lt;= b &amp;lt;= 20:&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;alIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            line = fin.readline().strip()&lt;br /&gt;
            if not line:&lt;br /&gt;
                raise ValueError(&amp;quot;File is empty or invalid format.&amp;quot;)&lt;br /&gt;
            n, a, b = map(int, line.split())&lt;br /&gt;
&lt;br /&gt;
        if not verify_restrictions(n, a, b):&lt;br /&gt;
            with open(&amp;quot;alOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        if n == 1:&lt;br /&gt;
            E = ((a * a + b * b) * (2 * b - 2) - 2 * (b * b - a * a) + 2 * b) // (a * a + b * b - 2 * b + 1)&lt;br /&gt;
            with open(&amp;quot;alOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(str(E))&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        numi = (b - 1) ** 2 + a * a&lt;br /&gt;
        pat = a * a + b * b&lt;br /&gt;
        invm, ins = gcd(numi, MOD)&lt;br /&gt;
&lt;br /&gt;
        initMat = [[2 * b, -pat], [1, 0]]&lt;br /&gt;
        Alt = [[2 * (b * b - a * a), 0], [2 * b, 0]]&lt;br /&gt;
        C = pwr(initMat, n - 1)&lt;br /&gt;
        sol = prod(C, Alt)&lt;br /&gt;
        En = -2 * pat + 2 * b&lt;br /&gt;
        E = (pat * sol[1][0] - sol[0][0] + En) % MOD&lt;br /&gt;
        E = (E * invm) % MOD&lt;br /&gt;
        if E &amp;lt; 0:&lt;br /&gt;
            E = (MOD + E) % MOD&lt;br /&gt;
&lt;br /&gt;
        with open(&amp;quot;alOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(str(E))&lt;br /&gt;
&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        with open(&amp;quot;alOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(str(e))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3785_-_AI&amp;diff=9815</id>
		<title>3785 - AI</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3785_-_AI&amp;diff=9815"/>
		<updated>2024-05-18T17:01:57Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Al Bundy a plecat la serviciu, lăsându-i soţiei lui, Peg, cardul de cumpărături. PIN-ul este valoarea expresiei E(n)=∑nk=1(2⋅(a2+b2)k2⋅cos(k⋅α)), &lt;br /&gt;
unde  α=arctg(ab) , iar n, a, b sunt numere naturale nenule.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se afle valoarea expresiei , modulo &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;alIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n, a, b&amp;lt;/code&amp;gt;, separate prin spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;alOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie valoarea expresiei , 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 ≤ 1012&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a , b ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;alIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 5 12&lt;br /&gt;
&amp;lt;code&amp;gt;alOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1918&lt;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Dacă α=arctg(5/12), atunci sin(α)=5/13 şi cos(α)=12/13.&lt;br /&gt;
Avem E(3)=2⋅13⋅cos(α)+2⋅13*2⋅cos(2α)+2⋅13*3⋅cos(3α)=2⋅13⋅12/13+2⋅13*2⋅(2⋅cos2(α)−1)+2⋅13*3⋅(4⋅cos*3(α)−3⋅cos(α))=24+238+1656=1918.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;alIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 21 12&lt;br /&gt;
&amp;lt;code&amp;gt;alOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1000000007&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return (1, 0)&lt;br /&gt;
    else:&lt;br /&gt;
        x, y = gcd(b, a % b)&lt;br /&gt;
        return (y, x - y * (a // b))&lt;br /&gt;
&lt;br /&gt;
def prod(x, y):&lt;br /&gt;
    ret = [[0, 0], [0, 0]]&lt;br /&gt;
    ret[0][0] = (x[0][0] * y[0][0] + x[0][1] * y[1][0]) % MOD&lt;br /&gt;
    ret[0][1] = (x[0][0] * y[0][1] + x[0][1] * y[1][1]) % MOD&lt;br /&gt;
    ret[1][0] = (x[1][0] * y[0][0] + x[1][1] * y[1][0]) % MOD&lt;br /&gt;
    ret[1][1] = (x[1][0] * y[0][1] + x[1][1] * y[1][1]) % MOD&lt;br /&gt;
    return ret&lt;br /&gt;
&lt;br /&gt;
def pwr(mat, n):&lt;br /&gt;
    nullMat = [[1, 0], [0, 1]]&lt;br /&gt;
    if n == 0:&lt;br /&gt;
        return nullMat&lt;br /&gt;
    if n % 2:&lt;br /&gt;
        return prod(mat, pwr(prod(mat, mat), n // 2))&lt;br /&gt;
    return pwr(prod(mat, mat), n // 2)&lt;br /&gt;
&lt;br /&gt;
def verify_restrictions(n, a, b):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 1012 and 1 &amp;lt;= a &amp;lt;= 20 and 1 &amp;lt;= b &amp;lt;= 20:&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;alIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            line = fin.readline().strip()&lt;br /&gt;
            if not line:&lt;br /&gt;
                raise ValueError(&amp;quot;File is empty or invalid format.&amp;quot;)&lt;br /&gt;
            n, a, b = map(int, line.split())&lt;br /&gt;
&lt;br /&gt;
        if not verify_restrictions(n, a, b):&lt;br /&gt;
            with open(&amp;quot;alOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        if n == 1:&lt;br /&gt;
            E = ((a * a + b * b) * (2 * b - 2) - 2 * (b * b - a * a) + 2 * b) // (a * a + b * b - 2 * b + 1)&lt;br /&gt;
            with open(&amp;quot;alOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(str(E))&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        numi = (b - 1) ** 2 + a * a&lt;br /&gt;
        pat = a * a + b * b&lt;br /&gt;
        invm, ins = gcd(numi, MOD)&lt;br /&gt;
&lt;br /&gt;
        initMat = [[2 * b, -pat], [1, 0]]&lt;br /&gt;
        Alt = [[2 * (b * b - a * a), 0], [2 * b, 0]]&lt;br /&gt;
        C = pwr(initMat, n - 1)&lt;br /&gt;
        sol = prod(C, Alt)&lt;br /&gt;
        En = -2 * pat + 2 * b&lt;br /&gt;
        E = (pat * sol[1][0] - sol[0][0] + En) % MOD&lt;br /&gt;
        E = (E * invm) % MOD&lt;br /&gt;
        if E &amp;lt; 0:&lt;br /&gt;
            E = (MOD + E) % MOD&lt;br /&gt;
&lt;br /&gt;
        with open(&amp;quot;alOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(str(E))&lt;br /&gt;
&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        with open(&amp;quot;alOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(str(e))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3123_-_summy&amp;diff=9814</id>
		<title>3123 - summy</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3123_-_summy&amp;diff=9814"/>
		<updated>2024-05-18T16:52:32Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Se dau n şi k numere naturale. Calculați suma ∑ni=1ik.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Se dau n şi k numere naturale. Calculați suma ∑ni=1ik.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Programul va afișa pe ecran valoarea sumei ∑ni=1ik, modulo 1.000.000.007.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
*1 ≤ n ≤ 100.000 şi 1 ≤ k ≤ 1.000.000.000 pentru 70% din teste&lt;br /&gt;
*1 ≤ n ≤ 1.000.000.000 şi 1 ≤ k ≤ 100.000 pentru 30% din teste&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 225&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 7 8&lt;br /&gt;
 7907396&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1000000007&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return (1, 0)&lt;br /&gt;
    else:&lt;br /&gt;
        x, y = gcd(b, a % b)&lt;br /&gt;
        return (y, x - y * (a // b))&lt;br /&gt;
&lt;br /&gt;
def invers(x):&lt;br /&gt;
    inv, _ = gcd(x, MOD)&lt;br /&gt;
    if inv &amp;lt;= 0:&lt;br /&gt;
        inv = MOD + inv % MOD&lt;br /&gt;
    return inv&lt;br /&gt;
&lt;br /&gt;
def pu(b, e):&lt;br /&gt;
    if e == 0:&lt;br /&gt;
        return 1&lt;br /&gt;
    elif e % 2 == 0:&lt;br /&gt;
        x = pu(b, e // 2)&lt;br /&gt;
        return (x * x) % MOD&lt;br /&gt;
    else:&lt;br /&gt;
        return (b * pu(b, e - 1)) % MOD&lt;br /&gt;
&lt;br /&gt;
def calculate_for_small_n(n, k):&lt;br /&gt;
    sol = 0&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        sol = (sol + pu(i, k)) % MOD&lt;br /&gt;
    return sol&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, k):&lt;br /&gt;
    return 1 &amp;lt;= n &amp;lt;= 100000 and 1 &amp;lt;= k &amp;lt;= 1000000000&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, k = map(int, input().split())&lt;br /&gt;
    if verifica_restrictii(n, k):&lt;br /&gt;
        if n &amp;lt;= 100000:&lt;br /&gt;
            print(calculate_for_small_n(n, k))&lt;br /&gt;
        else:&lt;br /&gt;
            suma = 1&lt;br /&gt;
            numarator = 1&lt;br /&gt;
            numitor = 1&lt;br /&gt;
            for i in range(2, k + 3):&lt;br /&gt;
                numarator = (numarator * (n - i)) % MOD&lt;br /&gt;
                numitor = (numitor * (1 - i)) % MOD&lt;br /&gt;
            if numitor &amp;lt; 0:&lt;br /&gt;
                numitor += MOD&lt;br /&gt;
            sol = (numarator * invers(numitor)) % MOD&lt;br /&gt;
            for i in range(2, k + 3):&lt;br /&gt;
                suma = (suma + pu(i, k)) % MOD&lt;br /&gt;
                numarator = (numarator * (n - i + 1)) % MOD&lt;br /&gt;
                numarator = (numarator * invers(n - i)) % MOD&lt;br /&gt;
                numitor = (numitor * (i - 1)) % MOD&lt;br /&gt;
                numitor = (-numitor * invers(k + 3 - i)) % MOD&lt;br /&gt;
                if numitor &amp;lt; 0:&lt;br /&gt;
                    numitor += MOD&lt;br /&gt;
                y = (numarator * invers(numitor)) % MOD&lt;br /&gt;
                sol = (sol + suma * y) % MOD&lt;br /&gt;
            print(sol)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&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;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
∑5i=1i*3=1**3+2**3+3**3+4**3+5**3=225&lt;/div&gt;</summary>
		<author><name>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1683_-_xor1&amp;diff=9813</id>
		<title>1683 - xor1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1683_-_xor1&amp;diff=9813"/>
		<updated>2024-05-18T16:48:35Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o matrice cu un număr infinit de linii și coloane indexate începând cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe prima linie matricea conține șirul numerelor naturale (&amp;lt;code&amp;gt;0, 1, 2, 3 …&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Pe fiecare linie începând cu linia a doua pe poziția &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; matricea conține suma xor a elementelor situate pe linia anterioara de la poziția &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; până la poziția &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se cere să se răspundă la &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; întrebări de forma “Pentru &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; date, să se determine numărul situat pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; coloana &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; a matricei”. Pentru a genera cele &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; întrebări vor fi cunoscute următoarele valori: .&lt;br /&gt;
&lt;br /&gt;
reprezintă valorile pentru prima întrebare. Următoarele întrebări  vor fi generate una din alta folosind următoarea regulă:&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;xor1IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele naturale  separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;xor1OUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; linii. Pe linia &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; se va afișa elementul situat pe linia  coloana  a matricei. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* Pentru 10% dintre teste &amp;lt;code&amp;gt;1 ≤ q ≤ 100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ m ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte 10% dintre teste &amp;lt;code&amp;gt;1 ≤ q ≤ 100000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ m ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte 30% dintre teste &amp;lt;code&amp;gt;1 ≤ q ≤ 50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ m ≤ 30000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte 50% dintre teste &amp;lt;code&amp;gt;1 ≤ q ≤ 100000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ m ≤ 108&amp;lt;/code&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ a,b ≤ 9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;xor1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 2 3 1 1 5&lt;br /&gt;
&amp;lt;code&amp;gt;xor1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 7&lt;br /&gt;
 0&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Avem &amp;lt;code&amp;gt;q=4&amp;lt;/code&amp;gt; întrebări.&lt;br /&gt;
&lt;br /&gt;
Pentru &amp;lt;code&amp;gt;i1=2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;j1=3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;a=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;m=5&amp;lt;/code&amp;gt; se obțin întrebările: &amp;lt;code&amp;gt;(2,3)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(3,4)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(4,0)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(0,1)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Matricea este:&lt;br /&gt;
&lt;br /&gt;
0 1 2 3 4 5 6 …&lt;br /&gt;
&lt;br /&gt;
0 1 3 0 4 1 7 …&lt;br /&gt;
&lt;br /&gt;
0 1 2 2 6 7 0 …&lt;br /&gt;
&lt;br /&gt;
0 1 3 1 7 0 0 …&lt;br /&gt;
&lt;br /&gt;
0 1 2 3 4 4 4 …&lt;br /&gt;
&lt;br /&gt;
…&lt;br /&gt;
&lt;br /&gt;
Se observă că pe pozițiile corespunzătoare întrebărilor avem valorile &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;xor1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 2 3 1 11 5&lt;br /&gt;
&amp;lt;code&amp;gt;xor1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Datele nu corespund restrictiilor impuse&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def check_restrictions(q, a, b, m):&lt;br /&gt;
    if not (1 &amp;lt;= a &amp;lt;= 9 and 1 &amp;lt;= b &amp;lt;= 9 and 1 &amp;lt;= q &amp;lt;= 100000 and 1 &amp;lt;= m &amp;lt;= 10**8):&lt;br /&gt;
        with open(&amp;quot;xor1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
            g.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;xor1IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        q, i, j, a, b, m = map(int, f.readline().strip().split())&lt;br /&gt;
    &lt;br /&gt;
    if not check_restrictions(q, a, b, m):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    results = []&lt;br /&gt;
    for _ in range(q):&lt;br /&gt;
        s = 0&lt;br /&gt;
        P = 1&lt;br /&gt;
        p = 0&lt;br /&gt;
        while P &amp;lt;= j:&lt;br /&gt;
            if ((i + P) &amp;amp; (j - P)) == 0:&lt;br /&gt;
                s |= (1 &amp;lt;&amp;lt; p)&lt;br /&gt;
            p += 1&lt;br /&gt;
            P &amp;lt;&amp;lt;= 1&lt;br /&gt;
        &lt;br /&gt;
        results.append(s)&lt;br /&gt;
        i = (a * i + b) % m&lt;br /&gt;
        j = (a * j + b) % m&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;xor1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        for result in results:&lt;br /&gt;
            g.write(f&amp;quot;{result}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1135_-_p2sah&amp;diff=9812</id>
		<title>1135 - p2sah</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1135_-_p2sah&amp;diff=9812"/>
		<updated>2024-05-18T16:37:05Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Se dă o tablă de șah cu &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; linii (numerotate de sus în jos începând cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) și &amp;lt;code&amp;gt;2n+1&amp;lt;/code&amp;gt; coloane (numerotate de la stânga la dreapta începând cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Pe prima linie pătratul din mijloc conține &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; gram de fân, iar celelalte pătrate de pe prima linie nu conțin nimic. Începând cu linia a doua fiecare pătrat conține o cantitate de fân obținută prin adunarea cantităților de fân din cele &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; pătrate ale liniei anterioare cu care se învecinează (pe verticală și diagonală). De exemplu dacă &amp;lt;code&amp;gt;n=3&amp;lt;/code&amp;gt; tabla are &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; linii, &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; coloane și următoarea configurație.&lt;br /&gt;
&lt;br /&gt;
Un cal pleacă de pe prima linie, de pe o coloana &amp;lt;code&amp;gt;k&amp;lt;=n&amp;lt;/code&amp;gt;, sare din orice poziție &amp;lt;code&amp;gt;(i,j)&amp;lt;/code&amp;gt; în poziția &amp;lt;code&amp;gt;(i+1,j+2)&amp;lt;/code&amp;gt; atât timp cât este posibil și mănâncă tot fânul din pătratele prin care trece. De exemplu, pentru &amp;lt;code&amp;gt;n=3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k=2&amp;lt;/code&amp;gt;, pătratele prin care trece calul sunt marcate cu asterisc (&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
= Cerinţe =&lt;br /&gt;
1. Cunoscând &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, să se calculeze cantitatea de fân de pe linia &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; a tablei.&lt;br /&gt;
&lt;br /&gt;
2. Cunoscând &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, să se calculeze câte grame de fân mănâncă un cal care pleacă de pe prima linie, de pe coloana &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Întrucât aceste numere pot fi mari, se cere doar restul modulo &amp;lt;code&amp;gt;100003&amp;lt;/code&amp;gt; ale acestor numere.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;p2sah.in&amp;lt;/code&amp;gt; conține pe prima linie un număr &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; cu valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. Pe a doua linie a fișierului de intrare se găsesc 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; separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
Dacă &amp;lt;code&amp;gt;t=1&amp;lt;/code&amp;gt; se va rezolva prima cerință, deci pentru valoarea &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; citită tabla are &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;2n+1&amp;lt;/code&amp;gt; coloane, iar &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; reprezintă numărul liniei de pe care trebuie calculată cantitatea de fân.&lt;br /&gt;
&lt;br /&gt;
Dacă &amp;lt;code&amp;gt;t=2&amp;lt;/code&amp;gt; se va rezolva a doua cerință, deci pentru valoarea &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; citită tabla are &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;2n+1&amp;lt;/code&amp;gt; coloane, iar &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; reprezintă numărul coloanei din prima linie de unde pleacă calul. &lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Dacă &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; din fișierul de intrare este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; se va rezolva doar prima cerință.&lt;br /&gt;
&lt;br /&gt;
În acest caz fișierul de ieșire &amp;lt;code&amp;gt;p2sahIN.txt.txt&amp;lt;/code&amp;gt; va conține un singur număr reprezentând cantitatea totală de fân din toate pătratele situate pe tabla pe linia &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; (trebuie afișat restul modulo &amp;lt;code&amp;gt;100003&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Dacă &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; din fișierul de intrare este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; se va rezolva doar a doua cerință.&lt;br /&gt;
&lt;br /&gt;
În acest caz fișierul de ieșire &amp;lt;code&amp;gt;p2sahOUT.txt&amp;lt;/code&amp;gt; va conține un singur număr reprezentând cantitatea totală de fân mâncată de un cal care pleacă de pe linia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și coloana &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; (trebuie afișat restul modulo &amp;lt;code&amp;gt;100003&amp;lt;/code&amp;gt;). În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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 ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* La cerința 1 pentru 80% dintre teste &amp;lt;code&amp;gt;k ≤ n ≤ 1.000.000&amp;lt;/code&amp;gt;, iar pentru alte 20% din teste &amp;lt;code&amp;gt;k ≤ n ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* La cerința 2 pentru 30% dintre teste &amp;lt;code&amp;gt;k ≤ n ≤ 1000&amp;lt;/code&amp;gt;, pentru alte 30% dintre teste &amp;lt;code&amp;gt;k ≤ n ≤ 1.000.000&amp;lt;/code&amp;gt;, iar pentru restul de 40% dintre teste &amp;lt;code&amp;gt;k ≤ n ≤ 1.000.000.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Rezolvarea corectă a primei cerințe asigură 20% din punctajul testului respectiv.&lt;br /&gt;
* Rezolvarea corectă a celei de a doua cerințe asigura 70% din punctajul testului respectiv.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;p2sahIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 3 2&lt;br /&gt;
&amp;lt;code&amp;gt;p2sahOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;p2sahIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 3 4&lt;br /&gt;
&amp;lt;code&amp;gt;p2sahOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 100003&lt;br /&gt;
&lt;br /&gt;
def solve(M, T, S):&lt;br /&gt;
    if M in S:&lt;br /&gt;
        return&lt;br /&gt;
    m = M // 2&lt;br /&gt;
&lt;br /&gt;
    solve(m + 1, T, S)&lt;br /&gt;
    solve(m, T, S)&lt;br /&gt;
    solve(m - 1, T, S)&lt;br /&gt;
    solve(m - 2, T, S)&lt;br /&gt;
    S.add(M)&lt;br /&gt;
    if M % 2:&lt;br /&gt;
        T[M] = (1 * T[m] * T[m - 1] + 1 * T[m] * T[m - 1] + 1 * T[m] * T[m] + 1 * T[m + 1] * T[m + 1]) % MOD&lt;br /&gt;
    else:&lt;br /&gt;
        T[M] = (1 * T[m] * T[m + 1] + 1 * T[m - 1] * T[m] + 1 * T[m - 2] * T[m] + 1 * T[m - 1] * T[m - 1]) % MOD&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(k, n):&lt;br /&gt;
    return 1 &amp;lt;= k &amp;lt;= n &amp;lt;= 1_000_000_000&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;p2sahIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        lines = f.readlines()&lt;br /&gt;
        if len(lines) &amp;lt; 2:&lt;br /&gt;
            with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        t = int(lines[0].strip())&lt;br /&gt;
        if t not in (1, 2):&lt;br /&gt;
            with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            n, k = map(int, lines[1].strip().split())&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
    if not check_restrictions(k, n):&lt;br /&gt;
        with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
            g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if t == 1:&lt;br /&gt;
        k -= 1&lt;br /&gt;
        sol = 1&lt;br /&gt;
        p = 3&lt;br /&gt;
        while k:&lt;br /&gt;
            if k &amp;amp; 1:&lt;br /&gt;
                sol = (sol * p) % MOD&lt;br /&gt;
            p = (p * p) % MOD&lt;br /&gt;
            k //= 2&lt;br /&gt;
    else:&lt;br /&gt;
        T = {0: 0, 1: 1, 2: 1, 3: 2}&lt;br /&gt;
        S = {0, 1, 2, 3}&lt;br /&gt;
        n = n + 2 - k&lt;br /&gt;
        solve(n, T, S)&lt;br /&gt;
        sol = T[n]&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        g.write(f&amp;quot;{sol}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1135_-_p2sah&amp;diff=9811</id>
		<title>1135 - p2sah</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1135_-_p2sah&amp;diff=9811"/>
		<updated>2024-05-18T16:35:41Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Se dă o tablă de șah cu &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; linii (numerotate de sus în jos începând cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) și &amp;lt;code&amp;gt;2n+1&amp;lt;/code&amp;gt; coloane (numerotate de la stânga la dreapta începând cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Pe prima linie pătratul din mijloc conține &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; gram de fân, iar celelalte pătrate de pe prima linie nu conțin nimic. Începând cu linia a doua fiecare pătrat conține o cantitate de fân obținută prin adunarea cantităților de fân din cele &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; pătrate ale liniei anterioare cu care se învecinează (pe verticală și diagonală). De exemplu dacă &amp;lt;code&amp;gt;n=3&amp;lt;/code&amp;gt; tabla are &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; linii, &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; coloane și următoarea configurație.&lt;br /&gt;
&lt;br /&gt;
Un cal pleacă de pe prima linie, de pe o coloana &amp;lt;code&amp;gt;k&amp;lt;=n&amp;lt;/code&amp;gt;, sare din orice poziție &amp;lt;code&amp;gt;(i,j)&amp;lt;/code&amp;gt; în poziția &amp;lt;code&amp;gt;(i+1,j+2)&amp;lt;/code&amp;gt; atât timp cât este posibil și mănâncă tot fânul din pătratele prin care trece. De exemplu, pentru &amp;lt;code&amp;gt;n=3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k=2&amp;lt;/code&amp;gt;, pătratele prin care trece calul sunt marcate cu asterisc (&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
= Cerinţe =&lt;br /&gt;
1. Cunoscând &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, să se calculeze cantitatea de fân de pe linia &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; a tablei.&lt;br /&gt;
&lt;br /&gt;
2. Cunoscând &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, să se calculeze câte grame de fân mănâncă un cal care pleacă de pe prima linie, de pe coloana &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Întrucât aceste numere pot fi mari, se cere doar restul modulo &amp;lt;code&amp;gt;100003&amp;lt;/code&amp;gt; ale acestor numere.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;p2sah.in&amp;lt;/code&amp;gt; conține pe prima linie un număr &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; cu valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. Pe a doua linie a fișierului de intrare se găsesc 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; separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
Dacă &amp;lt;code&amp;gt;t=1&amp;lt;/code&amp;gt; se va rezolva prima cerință, deci pentru valoarea &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; citită tabla are &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;2n+1&amp;lt;/code&amp;gt; coloane, iar &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; reprezintă numărul liniei de pe care trebuie calculată cantitatea de fân.&lt;br /&gt;
&lt;br /&gt;
Dacă &amp;lt;code&amp;gt;t=2&amp;lt;/code&amp;gt; se va rezolva a doua cerință, deci pentru valoarea &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; citită tabla are &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;2n+1&amp;lt;/code&amp;gt; coloane, iar &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; reprezintă numărul coloanei din prima linie de unde pleacă calul.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Dacă &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; din fișierul de intrare este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; se va rezolva doar prima cerință.&lt;br /&gt;
&lt;br /&gt;
În acest caz fișierul de ieșire &amp;lt;code&amp;gt;p2sahIN.txt.txt&amp;lt;/code&amp;gt; va conține un singur număr reprezentând cantitatea totală de fân din toate pătratele situate pe tabla pe linia &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; (trebuie afișat restul modulo &amp;lt;code&amp;gt;100003&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Dacă &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; din fișierul de intrare este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; se va rezolva doar a doua cerință.&lt;br /&gt;
&lt;br /&gt;
În acest caz fișierul de ieșire &amp;lt;code&amp;gt;p2sahOUT.txt&amp;lt;/code&amp;gt; va conține un singur număr reprezentând cantitatea totală de fân mâncată de un cal care pleacă de pe linia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și coloana &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; (trebuie afișat restul modulo &amp;lt;code&amp;gt;100003&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 ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* La cerința 1 pentru 80% dintre teste &amp;lt;code&amp;gt;k ≤ n ≤ 1.000.000&amp;lt;/code&amp;gt;, iar pentru alte 20% din teste &amp;lt;code&amp;gt;k ≤ n ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* La cerința 2 pentru 30% dintre teste &amp;lt;code&amp;gt;k ≤ n ≤ 1000&amp;lt;/code&amp;gt;, pentru alte 30% dintre teste &amp;lt;code&amp;gt;k ≤ n ≤ 1.000.000&amp;lt;/code&amp;gt;, iar pentru restul de 40% dintre teste &amp;lt;code&amp;gt;k ≤ n ≤ 1.000.000.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Rezolvarea corectă a primei cerințe asigură 20% din punctajul testului respectiv.&lt;br /&gt;
* Rezolvarea corectă a celei de a doua cerințe asigura 70% din punctajul testului respectiv.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;p2sahIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 3 2&lt;br /&gt;
&amp;lt;code&amp;gt;p2sahOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;p2sahIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 3 4&lt;br /&gt;
&amp;lt;code&amp;gt;p2sahOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 100003&lt;br /&gt;
&lt;br /&gt;
def solve(M, T, S):&lt;br /&gt;
    if M in S:&lt;br /&gt;
        return&lt;br /&gt;
    m = M // 2&lt;br /&gt;
&lt;br /&gt;
    solve(m + 1, T, S)&lt;br /&gt;
    solve(m, T, S)&lt;br /&gt;
    solve(m - 1, T, S)&lt;br /&gt;
    solve(m - 2, T, S)&lt;br /&gt;
    S.add(M)&lt;br /&gt;
    if M % 2:&lt;br /&gt;
        T[M] = (1 * T[m] * T[m - 1] + 1 * T[m] * T[m - 1] + 1 * T[m] * T[m] + 1 * T[m + 1] * T[m + 1]) % MOD&lt;br /&gt;
    else:&lt;br /&gt;
        T[M] = (1 * T[m] * T[m + 1] + 1 * T[m - 1] * T[m] + 1 * T[m - 2] * T[m] + 1 * T[m - 1] * T[m - 1]) % MOD&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(k, n):&lt;br /&gt;
    return 1 &amp;lt;= k &amp;lt;= n &amp;lt;= 1_000_000_000&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;p2sahIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        lines = f.readlines()&lt;br /&gt;
        if len(lines) &amp;lt; 2:&lt;br /&gt;
            with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        t = int(lines[0].strip())&lt;br /&gt;
        if t not in (1, 2):&lt;br /&gt;
            with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            n, k = map(int, lines[1].strip().split())&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
    if not check_restrictions(k, n):&lt;br /&gt;
        with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
            g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if t == 1:&lt;br /&gt;
        k -= 1&lt;br /&gt;
        sol = 1&lt;br /&gt;
        p = 3&lt;br /&gt;
        while k:&lt;br /&gt;
            if k &amp;amp; 1:&lt;br /&gt;
                sol = (sol * p) % MOD&lt;br /&gt;
            p = (p * p) % MOD&lt;br /&gt;
            k //= 2&lt;br /&gt;
    else:&lt;br /&gt;
        T = {0: 0, 1: 1, 2: 1, 3: 2}&lt;br /&gt;
        S = {0, 1, 2, 3}&lt;br /&gt;
        n = n + 2 - k&lt;br /&gt;
        solve(n, T, S)&lt;br /&gt;
        sol = T[n]&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;p2sahOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        g.write(f&amp;quot;{sol}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4045_-_Wl&amp;diff=9810</id>
		<title>4045 - Wl</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4045_-_Wl&amp;diff=9810"/>
		<updated>2024-05-18T16:27:36Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Cerința =&lt;br /&gt;
Kida a descoperit un nou joc, prin care pornind de la un număr oarecare poate ajunge la alte numere prin niște pași simpli: dacă la un moment de timp, &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;, Kida are numărul W, atunci la momentul de timp &amp;lt;code&amp;gt;T + 1&amp;lt;/code&amp;gt; ea poate să ajungă la orice alt număr &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; dacă:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;L &amp;lt; W&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; este divizibil cu &amp;lt;code&amp;gt;W - L&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; este divizibil cu &amp;lt;code&amp;gt;W - L&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 * L ≥ W&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kida are o mulțime de N numere, notată cu D. Acum, ea își pune Q întrebări de tipul: Dacă aș porni la momentul de timp T = 0 și aș avea numărul x, care este momentul de timp minim la care aș putea sa ajung la un număr din mulțimea D folosind regulile jocului descris mai sus? Dacă nu se poate ajunge la niciun număr din mulțimea D, atunci Kida va considera că răspunsul este -1.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Prima linie a input-ului conține numărul N. Pe a doua linie se află N numere naturale, reprezentând elementele mulțimii D. A treia linie conține numărul Q. Ultima linie va conțin cele Q numere, reprezentând întrebările pe care și le pune Kida.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Prima linie a input-ului conține numărul N. Pe a doua linie se află N numere naturale, reprezentând elementele mulțimii D. A treia linie conține numărul Q. Ultima linie va conțin cele Q numere, reprezentând întrebările pe care și le pune Kida.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
*1 ≤ N ≤ 10 000&lt;br /&gt;
*1 ≤ D[i] ≤ 100 000&lt;br /&gt;
*0 ≤ x ≤ 100 000&lt;br /&gt;
*1 ≤ Q ≤ 100 000&lt;br /&gt;
*Subtask #1: Răspunsul pentru fiecare întrebare este cel mult 1 – 10 puncte&lt;br /&gt;
*Subtask #2: Răspunsul pentru fiecare întrebare este cel mult 2 – alte 20 de puncte&lt;br /&gt;
*Subtask #3: Fără restricții – alte 70 de puncte&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 2&lt;br /&gt;
 3 4&lt;br /&gt;
 5&lt;br /&gt;
 7 8 10 3 64&lt;br /&gt;
Ieșire&lt;br /&gt;
 2&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
 4&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
INF = float(&#039;inf&#039;)&lt;br /&gt;
MAX_VAL = 100001&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, initial_values, queries):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= x &amp;lt;= 100000 for x in initial_values):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= len(queries) &amp;lt;= 100):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= x &amp;lt;= 100000 for x in queries):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def lee(n, initial_values, queries):&lt;br /&gt;
    minim = [INF] * (MAX_VAL + 1)&lt;br /&gt;
    q = deque(initial_values)&lt;br /&gt;
&lt;br /&gt;
    for x in initial_values:&lt;br /&gt;
        minim[x] = 0&lt;br /&gt;
&lt;br /&gt;
    while q:&lt;br /&gt;
        x = q.popleft()&lt;br /&gt;
        for d in range(1, int(x**0.5) + 1):&lt;br /&gt;
            if x % d == 0:&lt;br /&gt;
                if x + d &amp;lt;= MAX_VAL and minim[x + d] &amp;gt; minim[x] + 1:&lt;br /&gt;
                    minim[x + d] = minim[x] + 1&lt;br /&gt;
                    q.append(x + d)&lt;br /&gt;
                if x + (x // d) &amp;lt;= MAX_VAL and minim[x + (x // d)] &amp;gt; minim[x] + 1:&lt;br /&gt;
                    minim[x + (x // d)] = minim[x] + 1&lt;br /&gt;
                    q.append(x + (x // d))&lt;br /&gt;
&lt;br /&gt;
    results = []&lt;br /&gt;
    for x in queries:&lt;br /&gt;
        if minim[x] == INF:&lt;br /&gt;
            results.append(-1)&lt;br /&gt;
        else:&lt;br /&gt;
            results.append(minim[x])&lt;br /&gt;
    &lt;br /&gt;
    return results&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    initial_values = list(map(int, input().split()))&lt;br /&gt;
    q = int(input())&lt;br /&gt;
    queries = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    if check_restrictions(n, initial_values, queries):&lt;br /&gt;
        results = lee(n, initial_values, queries)&lt;br /&gt;
        for res in results:&lt;br /&gt;
            print(res)&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4045_-_Wl&amp;diff=9809</id>
		<title>4045 - Wl</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4045_-_Wl&amp;diff=9809"/>
		<updated>2024-05-18T16:24:10Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Kida a descoperit un nou joc, prin care pornind de la un număr oarecare poate ajunge la alte numere prin niște pași simpli: dacă la un moment de timp, T, Kida are numărul W, atunci la momentul de timp T + 1 ea poate să ajungă la orice alt număr L dacă:&lt;br /&gt;
&lt;br /&gt;
*L &amp;lt; W&lt;br /&gt;
*L este divizibil cu W - L&lt;br /&gt;
*W este divizibil cu W - L&lt;br /&gt;
*2 * L ≥ W&lt;br /&gt;
&lt;br /&gt;
Kida are o mulțime de N numere, notată cu D. Acum, ea își pune Q întrebări de tipul: Dacă aș porni la momentul de timp T = 0 și aș avea numărul x, care este momentul de timp minim la care aș putea sa ajung la un număr din mulțimea D folosind regulile jocului descris mai sus? Dacă nu se poate ajunge la niciun număr din mulțimea D, atunci Kida va considera că răspunsul este -1.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Prima linie a input-ului conține numărul N. Pe a doua linie se află N numere naturale, reprezentând elementele mulțimii D. A treia linie conține numărul Q. Ultima linie va conțin cele Q numere, reprezentând întrebările pe care și le pune Kida.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Prima linie a input-ului conține numărul N. Pe a doua linie se află N numere naturale, reprezentând elementele mulțimii D. A treia linie conține numărul Q. Ultima linie va conțin cele Q numere, reprezentând întrebările pe care și le pune Kida.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
*1 ≤ N ≤ 10 000&lt;br /&gt;
*1 ≤ D[i] ≤ 100 000&lt;br /&gt;
*0 ≤ x ≤ 100 000&lt;br /&gt;
*1 ≤ Q ≤ 100 000&lt;br /&gt;
*Subtask #1: Răspunsul pentru fiecare întrebare este cel mult 1 – 10 puncte&lt;br /&gt;
*Subtask #2: Răspunsul pentru fiecare întrebare este cel mult 2 – alte 20 de puncte&lt;br /&gt;
*Subtask #3: Fără restricții – alte 70 de puncte&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 2&lt;br /&gt;
: 3 4&lt;br /&gt;
: 5&lt;br /&gt;
: 7 8 10 3 64&lt;br /&gt;
; Ieșire&lt;br /&gt;
: 2&lt;br /&gt;
: 1 &lt;br /&gt;
: 2&lt;br /&gt;
: 0&lt;br /&gt;
: 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 3&lt;br /&gt;
: 5 6 7&lt;br /&gt;
: 4&lt;br /&gt;
: 2 8 11 14&lt;br /&gt;
; Iesire&lt;br /&gt;
: 3&lt;br /&gt;
: 1&lt;br /&gt;
: -1&lt;br /&gt;
: 3&lt;br /&gt;
&amp;lt;br&amp;gt;d&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
#4045 - Wl&lt;br /&gt;
def find_divisors(n):&lt;br /&gt;
    divisors = set()&lt;br /&gt;
&lt;br /&gt;
    # Adăugăm divizorii primi ai lui n în mulțime&lt;br /&gt;
    i = 2&lt;br /&gt;
    while i * i &amp;lt;= n:&lt;br /&gt;
        if n % i == 0:&lt;br /&gt;
            divisors.add(i)&lt;br /&gt;
            while n % i == 0:&lt;br /&gt;
                n //= i&lt;br /&gt;
        i += 1&lt;br /&gt;
&lt;br /&gt;
    if n &amp;gt; 1:&lt;br /&gt;
        divisors.add(n)&lt;br /&gt;
&lt;br /&gt;
    return divisors&lt;br /&gt;
&lt;br /&gt;
def min_time_to_reach_d(x, divisors_d):&lt;br /&gt;
    time = 0&lt;br /&gt;
&lt;br /&gt;
    # Pentru fiecare divizor prim al lui x, calculăm timpul minim&lt;br /&gt;
    for divisor in divisors_d:&lt;br /&gt;
        while x % divisor == 0 and (x // divisor) % 2 == 0:&lt;br /&gt;
            x //= divisor&lt;br /&gt;
            time += 1&lt;br /&gt;
&lt;br /&gt;
    if x &amp;gt; 1:&lt;br /&gt;
        time += 1&lt;br /&gt;
&lt;br /&gt;
    return time&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    N = int(input())&lt;br /&gt;
    D = list(map(int, input().split()))&lt;br /&gt;
    Q = int(input())&lt;br /&gt;
    questions = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 10000 and all(1 &amp;lt;= d &amp;lt;= 100000 for d in D) and 1 &amp;lt;= Q &amp;lt;= 100000 and all(0 &amp;lt;= x &amp;lt;= 100000 for x in questions)):&lt;br /&gt;
        print(&amp;quot;false&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Găsirea divizorilor primi ai elementelor din D&lt;br /&gt;
    divisors_D = set()&lt;br /&gt;
    for number in D:&lt;br /&gt;
        divisors_D.update(find_divisors(number))&lt;br /&gt;
&lt;br /&gt;
    # Răspuns la fiecare întrebare&lt;br /&gt;
    for question in questions:&lt;br /&gt;
        # Calculăm timpul minim pentru a ajunge la un număr din D&lt;br /&gt;
        time_to_reach_D = min_time_to_reach_d(question, divisors_D)&lt;br /&gt;
&lt;br /&gt;
        if time_to_reach_D == 0:&lt;br /&gt;
            print(-1)&lt;br /&gt;
        else:&lt;br /&gt;
            print(time_to_reach_D)&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2412_-_Sub_Mat_1&amp;diff=9808</id>
		<title>2412 - Sub Mat 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2412_-_Sub_Mat_1&amp;diff=9808"/>
		<updated>2024-05-18T15:05:24Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o matrice &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; cu următoarele proprietăţi:&lt;br /&gt;
&lt;br /&gt;
* conţine &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;&lt;br /&gt;
* conţine doar valorile &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;;&lt;br /&gt;
* pe fiecare linie valorile sunt plasate în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
Definim o submatrice determinată de perechea de linii &amp;lt;code&amp;gt;L1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;L2&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;L1 ≤ L2&amp;lt;/code&amp;gt;) şi de perechea de coloane &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;C1 ≤ C2&amp;lt;/code&amp;gt;) ca fiind totalitatea elementelor matricei &amp;lt;code&amp;gt;A[i,j]&amp;lt;/code&amp;gt; pentru care &amp;lt;code&amp;gt;L1 ≤ i ≤ L2&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;C1 ≤ j ≤ C2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dacă toate elementele unei submatrice sunt egale cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, atunci submatricea se numeşte nulă.&lt;br /&gt;
&lt;br /&gt;
Asupra matricei &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; putem efectua una sau mai multe operaţii de interschimbări de linii. Prin astfel de interschimbări liniile matricei pot fi rearanjate astfel încât matricea &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; să conţină cel puţin o submatrice nulă cu număr maxim de elemente.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind dată o astfel de matrice se cere să se determine numărul maxim de zerouri dintr-o submatrice nulă ce se poate obţine printr-o rearanjare a liniilor matricei date.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;submat1IN.txt&amp;lt;/code&amp;gt; conţine pe prima linie două numere naturale &amp;lt;code&amp;gt;n m&amp;lt;/code&amp;gt;, separate printr-un spaţiu, reprezentând numărul de linii, respectiv numărul de coloane ale matricei &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii ale fişierului sunt descrise cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii ale matricei &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;; pe fiecare linie din cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vor fi scrise câte &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; valori din mulţimea &amp;lt;code&amp;gt;{0, 1}&amp;lt;/code&amp;gt;, separate prin spaţii, reprezentând în ordine elementele liniei respective.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;submat1OUT.txt&amp;lt;/code&amp;gt; va conţine o singură linie pe care va fi scris un număr natural reprezentând numărul maxim de elemente pe care îl conţine o submatrice nulă rezultată în urma rearanjărilor liniilor matricei &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* Pentru &amp;lt;code&amp;gt;60%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;n, m ≤ 100&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;submat1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 5&lt;br /&gt;
 0 0 0 1 1&lt;br /&gt;
 0 1 1 1 1&lt;br /&gt;
 0 0 0 0 1&lt;br /&gt;
&amp;lt;code&amp;gt;submat1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Dacă rearanjăm liniile astfel încât matricea rezultată să fie următoarea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 0 0 1 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 0 0 0 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 1 1 1 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
atunci se observă că submatricea determinată de prima şi a doua linie şi de prima şi a treia coloană conţine &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; valori de &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; fiind numărul maxim posibil).&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;submat1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 5&lt;br /&gt;
 0 0 0 1 1&lt;br /&gt;
 0 1 1 1 1&lt;br /&gt;
 0 0 0 0 1&lt;br /&gt;
&amp;lt;code&amp;gt;submat1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restricii(n, m):&lt;br /&gt;
    return 2 &amp;lt;= n &amp;lt;= 1000 and 2 &amp;lt;= m &amp;lt;= 1000&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;submat1IN.txt&#039;, &#039;r&#039;) as fin:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restricii(n, m):&lt;br /&gt;
        with open(&#039;submat1OUT.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return  &lt;br /&gt;
    a = [0] * n&lt;br /&gt;
    with open(&#039;submat1IN.txt&#039;, &#039;r&#039;) as fin:&lt;br /&gt;
        next(fin)  &lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            linie = list(map(int, fin.readline().split()))&lt;br /&gt;
            a[i] = linie.count(0)&lt;br /&gt;
&lt;br /&gt;
    a.sort(reverse=True)&lt;br /&gt;
    aria = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if aria &amp;lt; (i + 1) * a[i]:&lt;br /&gt;
            aria = (i + 1) * a[i]&lt;br /&gt;
&lt;br /&gt;
    with open(&#039;submat1OUT.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        fout.write(str(aria) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2387_-_Mosia_1&amp;diff=9807</id>
		<title>2387 - Mosia 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2387_-_Mosia_1&amp;diff=9807"/>
		<updated>2024-05-18T14:49:14Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Păcală a primit, aşa cum era învoiala, un petec de teren de pe moşia boierului. Terenul este împrejmuit complet cu segmente drepte de gard ce se sprijină la ambele capete de câte un par zdravăn. La o nouă prinsoare, Păcală iese iar in câştig şi primeşte dreptul să strămute nişte pari, unul câte unul, cum i-o fi voia, astfel încât să-şi extindă suprafaţa de teren. Dar învoiala prevede că fiecare par poate fi mutat în orice direcţie, dar nu pe o distanţă mai mare decât o valoare dată (scrisă pe fiecare par) şi fiecare segment de gard, fiind cam şubred, poate fi rotit şi prelungit de la un singur capăt, celălalt rămânând nemişcat.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând poziţiile iniţiale ale parilor şi valoarea înscrisă pe fiecare par, se cere suprafaţa maximă cu care poate să-şi extindă Păcală proprietatea. Se ştie că parii sunt daţi într-o ordine oarecare, poziţiile lor iniţiale sunt date prin numere întregi de cel mult &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; cifre, distanțele pe care fiecare par poate fi deplasat sunt numere naturale strict pozitive şi figura formată de terenul iniţial este un poligon neconcav.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;mosia1IN.txt&amp;lt;/code&amp;gt; conţine &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; linii cu următoarele valori:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; – numărul de pari&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x[1] y[1] d[1]&amp;lt;/code&amp;gt; – coordonatele iniţiale şi distanţa pe care poate fi mutat parul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x[2] y[2] d[2]&amp;lt;/code&amp;gt; – coordonatele iniţiale şi distanţa pe care poate fi mutat parul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
. . .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;x[n] y[n] d[n]&amp;lt;/code&amp;gt; – coordonatele iniţiale şi distanţa pe care poate fi mutat parul &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;mosia1OUT.txt&amp;lt;/code&amp;gt; se scrie un număr real cu &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; zecimale ce reprezintă suprafața maximă cu care se poate mări moșia. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 &amp;lt; N ≤ 200&amp;lt;/code&amp;gt; număr natural&lt;br /&gt;
* &amp;lt;code&amp;gt;–1000 &amp;lt; x[i], y[i] &amp;lt; 1000&amp;lt;/code&amp;gt; numere întregi&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; d[i] ≤ 20&amp;lt;/code&amp;gt; numere întregi&lt;br /&gt;
* poligonul neconcav se defineşte ca un poligon convex cu unele vârfuri coliniare&lt;br /&gt;
* poziţiile parilor sunt date într-o ordine oarecare&lt;br /&gt;
* poligonul obţinut după mutarea parilor poate fi concav&lt;br /&gt;
* poziţiile finale ale parilor nu sunt in mod obligatoriu numere naturale&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;mosia1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 -3 0 2&lt;br /&gt;
 3 0 3&lt;br /&gt;
 0 6 2&lt;br /&gt;
 0 -6 6&lt;br /&gt;
&amp;lt;code&amp;gt;mosia1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 30.0000&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Prin mutarea parilor &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; cu câte &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și respectiv &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; unități, se obține un teren având suprafaţa cu &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de unităţi mai mare decât terenul iniţial.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;mosia1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 -3 0 2&lt;br /&gt;
 3 0 3&lt;br /&gt;
 0 6 2&lt;br /&gt;
 0 -6 6&lt;br /&gt;
&amp;lt;code&amp;gt;mosia1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
m = 10000000.0&lt;br /&gt;
&lt;br /&gt;
def cit():&lt;br /&gt;
    global n, p&lt;br /&gt;
    p = []&lt;br /&gt;
    with open(&amp;quot;mosia1IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            x, y, d = map(int, f.readline().strip().split())&lt;br /&gt;
            p.append({&#039;x&#039;: x, &#039;y&#039;: y, &#039;d&#039;: d})&lt;br /&gt;
&lt;br /&gt;
def poz(pp, u):&lt;br /&gt;
    i = pp&lt;br /&gt;
    j = u&lt;br /&gt;
    i0 = 0&lt;br /&gt;
    j0 = -1&lt;br /&gt;
    while i &amp;lt; j:&lt;br /&gt;
        if p[i][&#039;si&#039;] - p[j][&#039;si&#039;] &amp;gt; 1/m or (abs(p[i][&#039;si&#039;] - p[j][&#039;si&#039;]) &amp;lt; 1/m and p[i][&#039;di&#039;] - p[j][&#039;di&#039;] &amp;gt; 1/m and p[i][&#039;si&#039;] &amp;lt; 0) or (abs(p[i][&#039;si&#039;] - p[j][&#039;si&#039;]) &amp;lt; 1/m and p[j][&#039;di&#039;] - p[i][&#039;di&#039;] &amp;gt; 1/m and p[i][&#039;si&#039;] &amp;gt; 0):&lt;br /&gt;
            p[i], p[j] = p[j], p[i]&lt;br /&gt;
            aux1 = -i0&lt;br /&gt;
            i0 = -j0&lt;br /&gt;
            j0 = aux1&lt;br /&gt;
        i += i0&lt;br /&gt;
        j += j0&lt;br /&gt;
    return i&lt;br /&gt;
&lt;br /&gt;
def quick(p, u):&lt;br /&gt;
    if p &amp;lt; u:&lt;br /&gt;
        k = poz(p, u)&lt;br /&gt;
        quick(p, k - 1)&lt;br /&gt;
        quick(k + 1, u)&lt;br /&gt;
&lt;br /&gt;
def preprocesare():&lt;br /&gt;
    global p&lt;br /&gt;
    i0 = 0&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if p[i][&#039;x&#039;] &amp;lt; p[i0][&#039;x&#039;] or (p[i][&#039;x&#039;] == p[i0][&#039;x&#039;] and p[i][&#039;y&#039;] &amp;lt; p[i0][&#039;y&#039;]):&lt;br /&gt;
            i0 = i&lt;br /&gt;
    p[0], p[i0] = p[i0], p[0]&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        p[i][&#039;di&#039;] = math.sqrt((p[i][&#039;x&#039;] - p[0][&#039;x&#039;])**2 + (p[i][&#039;y&#039;] - p[0][&#039;y&#039;])**2)&lt;br /&gt;
        p[i][&#039;si&#039;] = (p[i][&#039;y&#039;] - p[0][&#039;y&#039;]) / p[i][&#039;di&#039;]&lt;br /&gt;
    quick(1, n-1)&lt;br /&gt;
    p = [p[-1]] + p + [p[0]]&lt;br /&gt;
&lt;br /&gt;
def arie(i):&lt;br /&gt;
    return p[i][&#039;d&#039;] * math.sqrt((p[i-1][&#039;x&#039;] - p[i+1][&#039;x&#039;])**2 + (p[i-1][&#039;y&#039;] - p[i+1][&#039;y&#039;])**2) / 2.0&lt;br /&gt;
&lt;br /&gt;
def pd():&lt;br /&gt;
    global sol&lt;br /&gt;
    s0 = [0] * (n + 2)&lt;br /&gt;
    s1 = [0] * (n + 2)&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        s0[i+1] = max(s0[i], s1[i])&lt;br /&gt;
        s1[i+1] = s0[i] + arie(i + 1)&lt;br /&gt;
    sol = max(s0[n], s1[n])&lt;br /&gt;
    s0[0] = 0&lt;br /&gt;
    s1[0] = arie(1)&lt;br /&gt;
    s0[1] = s1[1] = s1[0]&lt;br /&gt;
    for i in range(2, n):&lt;br /&gt;
        s0[i] = max(s0[i-1], s1[i-1])&lt;br /&gt;
        s1[i] = s0[i-1] + arie(i + 1)&lt;br /&gt;
    sol = max(sol, s0[n-1])&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii():&lt;br /&gt;
    if not (3 &amp;lt; n &amp;lt;= 200):&lt;br /&gt;
        return False&lt;br /&gt;
    for punct in p:&lt;br /&gt;
        if not (-1000 &amp;lt; punct[&#039;x&#039;] &amp;lt; 1000 and -1000 &amp;lt; punct[&#039;y&#039;] &amp;lt; 1000 and 0 &amp;lt; punct[&#039;d&#039;] &amp;lt;= 20):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global sol&lt;br /&gt;
    cit()&lt;br /&gt;
    if not verifica_restrictii():&lt;br /&gt;
        with open(&amp;quot;mosia1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    preprocesare()&lt;br /&gt;
    pd()&lt;br /&gt;
    with open(&amp;quot;mosia1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{sol:.4f}&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0702_-_Pascal&amp;diff=9806</id>
		<title>0702 - Pascal</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0702_-_Pascal&amp;diff=9806"/>
		<updated>2024-05-18T14:43:29Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Triunghiul lui Pascal este un aranjament geometric de numere ce poartă numele celebrului matematician francez Blaise Pascal (19 iunie 1623 – 19 august 1662), deoarece el a fost prima persoană care a descoperit importanţa tuturor modelelor din componenţa acestuia.&lt;br /&gt;
&lt;br /&gt;
Triunghiul începe cu numărul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Acest rând este considerat rândul &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; al triunghiului. Restul numerelor din acest triunghi se formează ca suma celor două numere de deasupra (considerând că toate numerele din afara triunghiului sunt întotdeauna zero). Prin urmare, rândul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; va fi format din &amp;lt;code&amp;gt;1 = 0 + 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 = 1 + 0&amp;lt;/code&amp;gt;, iar rândul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; va fi format din &amp;lt;code&amp;gt;1 = 0 + 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2 = 1 + 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 = 1 + 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Fie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; două numere naturale nenule cu proprietățile:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este număr prim;&lt;br /&gt;
* &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; este o putere naturală a lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Notăm cu &amp;lt;code&amp;gt;M(p)&amp;lt;/code&amp;gt; numărul de multipli de &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; din primele &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; rânduri ale triunghiului lui Pascal.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se scrie un program care citeşte numerele naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și determină numărul &amp;lt;code&amp;gt;M(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;pascalIN.txt&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;p&amp;lt;/code&amp;gt; separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;pascalOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;M(p)&amp;lt;/code&amp;gt; cu semnificația de mai sus. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ n ≤ 109&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ p ≤ 103&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste au &amp;lt;code&amp;gt;n ≤ 104&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;50%&amp;lt;/code&amp;gt; din teste au &amp;lt;code&amp;gt;n ≤ 106&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;pascalIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;pascalOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 9&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
În primele &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; rânduri ale triunghiului se găsesc &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; multipli de &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;2,4,6,4,10,10,6,20,6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;pascalIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2196 13&lt;br /&gt;
&amp;lt;code&amp;gt;pascalOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1660932&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
În primele &amp;lt;code&amp;gt;2197&amp;lt;/code&amp;gt; rânduri ale triunghiului se găsesc &amp;lt;code&amp;gt;1660932&amp;lt;/code&amp;gt; multipli de &amp;lt;code&amp;gt;13&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
#0702 - Pascal&lt;br /&gt;
def is_prime(num):&lt;br /&gt;
    if num &amp;lt; 2:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(2, int(num**0.5) + 1):&lt;br /&gt;
        if num % i == 0:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def calculate_M_pascal(n, p):&lt;br /&gt;
    M_p = 0&lt;br /&gt;
    current_power = 1&lt;br /&gt;
    &lt;br /&gt;
    while current_power &amp;lt;= n + 1:&lt;br /&gt;
        M_p += (n + 1) // current_power&lt;br /&gt;
        current_power *= p&lt;br /&gt;
    &lt;br /&gt;
    return M_p&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, p):&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 10**9):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (2 &amp;lt;= p &amp;lt;= 10**3):&lt;br /&gt;
        return False&lt;br /&gt;
    if n &amp;gt; 10**4 and p &amp;gt; 2:&lt;br /&gt;
        return False&lt;br /&gt;
    if n &amp;gt; 10**6 and p &amp;gt; 2:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&#039;pascalin.txt&#039;, &#039;r&#039;) as file:&lt;br /&gt;
        n, p = map(int, file.readline().split())&lt;br /&gt;
&lt;br /&gt;
    # Verificare restricții&lt;br /&gt;
    if not check_restrictions(n, p):&lt;br /&gt;
        print(&amp;quot;false&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Verificare dacă p este prim&lt;br /&gt;
    if not is_prime(p):&lt;br /&gt;
        print(&amp;quot;false&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Calculul lui M(p)&lt;br /&gt;
    result = calculate_M_pascal(n, p)&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
    with open(&#039;pascalout.txt&#039;, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(str(result))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1769_-_albume&amp;diff=9805</id>
		<title>1769 - albume</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1769_-_albume&amp;diff=9805"/>
		<updated>2024-05-18T14:40:03Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tudoraș are o pasiune pentru muzică. El deține câte &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; albume din discografia fiecăreia dintre cele &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; formații pe care le ascultă. În fiecare zi, Tudoraș extrage la întamplare exact &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; albume din colecția sa, pe care le ascultă în cursul zilei.&lt;br /&gt;
&lt;br /&gt;
La finalul zilei, Tudoraș analizează albumele ascultate. Concret, el numără de la câte formații diferite provin cele Q albume alese și își notează această valoare.&lt;br /&gt;
&lt;br /&gt;
Care va fi media aritmetică a valorilor notate, dacă procesul se repetă pentru un număr infinit de zile? Cu alte cuvinte, care este valoarea medie (expected value) a numărului de formații ascultate într-o zi?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul &amp;lt;code&amp;gt;albumeIN.txt&amp;lt;/code&amp;gt; conține pe prima linie trei valori separate prin spațiu: &amp;lt;code&amp;gt;C K Q&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;albumeOUT.txt&amp;lt;/code&amp;gt; trebuie să conțină pe prima linie o singură valoare reală: media aritmetică a valorilor notate de Tudoraș. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ C, K ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ min(1000, C*K)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru teste în valoare de 10 puncte, &amp;lt;code&amp;gt;K = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru alte teste în valoare de 10 puncte, &amp;lt;code&amp;gt;Q = C * K&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru alte teste în valoare de 20 de puncte, &amp;lt;code&amp;gt;C * K ≤ 10&amp;lt;/code&amp;gt;.&lt;br /&gt;
* În fiecare zi, toate albumele au probabilitate egală de a fi extrase.&lt;br /&gt;
* Rezultatul este considerat corect dacă are o eroare absolută de cel mult &amp;lt;code&amp;gt;10-6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;albumeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2 2&lt;br /&gt;
&amp;lt;code&amp;gt;albumeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1.666666667&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 =&lt;br /&gt;
&amp;lt;code&amp;gt;albumeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 232 654 27 &lt;br /&gt;
&amp;lt;code&amp;gt;albumeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 25.542102567 &lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(c, k, q):&lt;br /&gt;
    if 1 &amp;lt;= c &amp;lt;= 1000 and 1 &amp;lt;= k &amp;lt;= 1000 and 1 &amp;lt;= q &amp;lt;= min(1000, c * k):&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;albumeIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            c, k, q = map(int, fin.readline().split())&lt;br /&gt;
        &lt;br /&gt;
        if not verifica_restrictii(c, k, q):&lt;br /&gt;
            with open(&amp;quot;albumeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        a = 1.0&lt;br /&gt;
        for i in range(q):&lt;br /&gt;
            a *= (k * (c - 1.0) - i) / (k * c - i)&lt;br /&gt;
        &lt;br /&gt;
        rezultat = (1.0 - a) * c&lt;br /&gt;
        with open(&amp;quot;albumeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(f&amp;quot;{rezultat:.9f}&amp;quot;)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        with open(&amp;quot;albumeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(f&amp;quot;Eroare: {str(e)}&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0673_-_Dif_Sub&amp;diff=9804</id>
		<title>0673 - Dif Sub</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0673_-_Dif_Sub&amp;diff=9804"/>
		<updated>2024-05-18T14:35:57Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Considerăm un arbore binar cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri în care fiecare nod este numerotat 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 conține o valoare număr natural. Să se determine diferența în valoare absolută a sumei valorilor memorate în subarborele stâng al rădăcinii și suma valorilor memorate în subarborele drept al rădăcinii.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;difsubIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Fiecare dintre următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii contine câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;X st dr&amp;lt;/code&amp;gt;; linia &amp;lt;code&amp;gt;i + 1&amp;lt;/code&amp;gt; din fișier conține informatiile despre nodul numerotat cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; reprezintă valoare din nod, &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; reprezintă numărul de ordine al descendentului stâng sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; dacă nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; nu are descendent stâng, iar &amp;lt;code&amp;gt;dr&amp;lt;/code&amp;gt; reprezintă numărul de ordine al descendentului drept sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; dacă nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; nu are descendent drept.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;difsubOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, cu semnificația precizată. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* valorile din nodurile arborelui vor fi mai mici sau egale cu &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;difsubIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 2 3 5&lt;br /&gt;
 6 0 6&lt;br /&gt;
 1 0 0&lt;br /&gt;
 7 1 2&lt;br /&gt;
 4 0 0&lt;br /&gt;
 10 0 0&lt;br /&gt;
&amp;lt;code&amp;gt;difsubOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 9&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;difsubIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001&lt;br /&gt;
 2 3 5&lt;br /&gt;
 6 0 6&lt;br /&gt;
 1 0 0&lt;br /&gt;
 7 1 2&lt;br /&gt;
 4 0 0&lt;br /&gt;
 10 0 0&lt;br /&gt;
&amp;lt;code&amp;gt;difsubOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def check_restrictions(n, x):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(0 &amp;lt;= val &amp;lt;= 1000000 for val in x):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def SRD(k, st, dr, x):&lt;br /&gt;
    global d&lt;br /&gt;
    if st[k] != 0:&lt;br /&gt;
        SRD(st[k], st, dr, x)&lt;br /&gt;
    d += x[k]&lt;br /&gt;
    if dr[k] != 0:&lt;br /&gt;
        SRD(dr[k], st, dr, x)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global d&lt;br /&gt;
    with open(&amp;quot;difsubIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        x = [0] * (n + 1)&lt;br /&gt;
        st = [0] * (n + 1)&lt;br /&gt;
        dr = [0] * (n + 1)&lt;br /&gt;
        nod = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            vals = f.readline().strip().split()&lt;br /&gt;
            if len(vals) != 3:&lt;br /&gt;
                with open(&amp;quot;difsubOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                    g.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
&lt;br /&gt;
            x[i] = int(vals[0])&lt;br /&gt;
            st[i] = int(vals[1])&lt;br /&gt;
            dr[i] = int(vals[2])&lt;br /&gt;
            if st[i]:&lt;br /&gt;
                nod[st[i]] = 1&lt;br /&gt;
            if dr[i]:&lt;br /&gt;
                nod[dr[i]] = 1&lt;br /&gt;
&lt;br /&gt;
    if not check_restrictions(n, x[1:]):&lt;br /&gt;
        with open(&amp;quot;difsubOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
            g.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    rad = 1&lt;br /&gt;
    while nod[rad]:&lt;br /&gt;
        rad += 1&lt;br /&gt;
&lt;br /&gt;
    d = 0&lt;br /&gt;
    SRD(st[rad], st, dr, x)&lt;br /&gt;
    s = d&lt;br /&gt;
    d = 0&lt;br /&gt;
    SRD(dr[rad], st, dr, x)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;difsubOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        if s &amp;gt; d:&lt;br /&gt;
            g.write(str(s - d))&lt;br /&gt;
        else:&lt;br /&gt;
            g.write(str(d - s))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0674_-_Count_Sub&amp;diff=9803</id>
		<title>0674 - Count Sub</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0674_-_Count_Sub&amp;diff=9803"/>
		<updated>2024-05-18T14:31:11Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Considerăm un arbore binar cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri în care fiecare nod este numerotat 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 conține o valoare număr natural. Se dau &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri din arbore și se cere determinarea, pentru fiecare nod, a numărului de noduri din subarborele cu rădăcina în acel nod.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;countsubIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Fiecare dintre următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii contine câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;X st dr&amp;lt;/code&amp;gt;; linia &amp;lt;code&amp;gt;i + 1&amp;lt;/code&amp;gt; din fișier conține informatiile despre nodul numerotat cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; reprezintă valoare din nod, &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; reprezintă numărul de ordine al descendentului stâng sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; dacă nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; nu are descendent stâng, iar &amp;lt;code&amp;gt;dr&amp;lt;/code&amp;gt; reprezintă numărul de ordine al descendentului drept sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; dacă nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; nu are descendent drept.&lt;br /&gt;
&lt;br /&gt;
Pe următoarea linie se află numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar pe fiecare dintre următoarele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii se află câte un număr natural cuprins î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 nodul curent.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;countsubOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii; fiecare linie va conține numărul de noduri din subarborele cu rădăcina în nodul corespunzător. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* valorile din nodurile arborelui vor fi mai mici sau egale cu &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;countsubIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 2 3 5&lt;br /&gt;
 6 0 6&lt;br /&gt;
 1 0 0&lt;br /&gt;
 7 1 2&lt;br /&gt;
 4 0 0&lt;br /&gt;
 10 0 0&lt;br /&gt;
 4&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;code&amp;gt;countsubOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
 6&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;countsubIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001&lt;br /&gt;
 2 3 5&lt;br /&gt;
 6 0 6&lt;br /&gt;
 1 0 0&lt;br /&gt;
 7 1 2&lt;br /&gt;
 4 0 0&lt;br /&gt;
 10 0 0&lt;br /&gt;
 4&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;code&amp;gt;countsubOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Exemplul corespunde arborelui de mai jos, în care au fost marcate cu albastru valorile din noduri, iar cu roșu numerele de ordine ale nodurilor.Rezolvare&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def check_restrictions(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def count(k, s, d):&lt;br /&gt;
    if k == 0:&lt;br /&gt;
        return 0&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 + count(s[k], s, d) + count(d[k], s, d)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;countsubIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        try:&lt;br /&gt;
            n = int(fin.readline().strip())&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            with open(&amp;quot;countsubOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        s = [0] * (n + 1)&lt;br /&gt;
        d = [0] * (n + 1)&lt;br /&gt;
        &lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            line = fin.readline().strip().split()&lt;br /&gt;
            if len(line) != 3:&lt;br /&gt;
                with open(&amp;quot;countsubOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                    fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            x, s[i], d[i] = map(int, line)&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            k = int(fin.readline().strip())&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            with open(&amp;quot;countsubOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        queries = []&lt;br /&gt;
        for _ in range(k):&lt;br /&gt;
            try:&lt;br /&gt;
                queries.append(int(fin.readline().strip()))&lt;br /&gt;
            except ValueError:&lt;br /&gt;
                with open(&amp;quot;countsubOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                    fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
    &lt;br /&gt;
    if not check_restrictions(n, k):&lt;br /&gt;
        with open(&amp;quot;countsubOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;countsubOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for y in queries:&lt;br /&gt;
            fout.write(f&amp;quot;{count(y, s, d)}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0677_-_Nivele_Bin&amp;diff=9802</id>
		<title>0677 - Nivele Bin</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0677_-_Nivele_Bin&amp;diff=9802"/>
		<updated>2024-05-18T14:25:19Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Considerăm un arbore binar cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri în care fiecare nod este numerotat 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 conține o valoare număr natural. În acest arbore rădăcina este considerată pe nivelul &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, descendenții direcți ai rădăcinii pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, etc. Să se determine numărul de nivele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; din arbore și, pentru fiecare nivel &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; de la &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, numărul de noduri situate pe acel nivel.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nivelebinIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Fiecare dintre următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii conține câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;X st dr&amp;lt;/code&amp;gt;; linia &amp;lt;code&amp;gt;i + 1&amp;lt;/code&amp;gt; din fișier conține informațiile despre nodul numerotat cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; reprezintă valoare din nod, &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; reprezintă numărul de ordine al descendentului stâng sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; dacă nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; nu are descendent stâng, iar &amp;lt;code&amp;gt;dr&amp;lt;/code&amp;gt; reprezintă numărul de ordine al descendentului drept sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; dacă nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; nu are descendent drept.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nivelebinOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;k+1&amp;lt;/code&amp;gt; numere naturale separate prin exact un spațiu, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea număr reprezentând numărul de noduri situate pe nivelul &amp;lt;code&amp;gt;i-1&amp;lt;/code&amp;gt; din arbore. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* valorile din nodurile arborelui vor fi mai mici sau egale cu &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;nivelebinIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 2 3 5&lt;br /&gt;
 6 0 6&lt;br /&gt;
 1 0 0&lt;br /&gt;
 7 1 2&lt;br /&gt;
 4 0 0&lt;br /&gt;
 10 0 0&lt;br /&gt;
&amp;lt;code&amp;gt;nivelebinOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 1 2 3&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Exemplul corespunde arborelui de mai jos, în care au fost marcate cu albastru valorile din noduri, iar cu roșu numerele de ordine ale nodurilor.&lt;br /&gt;
&lt;br /&gt;
Arborele conține trei nivele:&lt;br /&gt;
&lt;br /&gt;
* nivelul &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; conține doar rădăcina, nodul numerotat cu &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
* nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; conține două noduri, cele numerotate cu &amp;lt;code&amp;gt;1 2&amp;lt;/code&amp;gt;&lt;br /&gt;
* nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; conține trei noduri, cele numerotate cu &amp;lt;code&amp;gt;3 5 6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;nivelebinIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001&lt;br /&gt;
 2 3 5&lt;br /&gt;
 6 0 6&lt;br /&gt;
 1 0 0&lt;br /&gt;
 7 1 2&lt;br /&gt;
 4 0 0&lt;br /&gt;
 10 0 0&lt;br /&gt;
&amp;lt;code&amp;gt;nivelebinOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def completniv(k, niv, nivele, s, d):&lt;br /&gt;
    if k != 0:&lt;br /&gt;
        nivele[k] = niv&lt;br /&gt;
        completniv(s[k], niv + 1, nivele, s, d)&lt;br /&gt;
        completniv(d[k], niv + 1, nivele, s, d)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, noduri):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    for x, s, d in noduri:&lt;br /&gt;
        if x &amp;gt; 1000000 or s &amp;gt; 1000000 or d &amp;gt; 1000000:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;nivelebinIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            n = int(fin.readline().strip())&lt;br /&gt;
            noduri = [tuple(map(int, fin.readline().strip().split())) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
            if not verifica_restrictii(n, noduri):&lt;br /&gt;
                raise ValueError(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            s = [0] * (n + 1)&lt;br /&gt;
            d = [0] * (n + 1)&lt;br /&gt;
            p = [0] * (n + 1)&lt;br /&gt;
            nivele = [0] * (n + 1)&lt;br /&gt;
            &lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                x, s[i], d[i] = noduri[i-1]&lt;br /&gt;
                p[s[i]] = 1&lt;br /&gt;
                p[d[i]] = 1&lt;br /&gt;
&lt;br /&gt;
            r = 0&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                if p[i] == 0:&lt;br /&gt;
                    r = i&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
            completniv(r, 0, nivele, s, d)&lt;br /&gt;
            &lt;br /&gt;
            nivmax = max(nivele)&lt;br /&gt;
&lt;br /&gt;
            with open(&amp;quot;nivelebinOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(f&amp;quot;{nivmax + 1}\n&amp;quot;)&lt;br /&gt;
                for niv in range(nivmax + 1):&lt;br /&gt;
                    k = sum(1 for j in range(1, n + 1) if nivele[j] == niv)&lt;br /&gt;
                    fout.write(f&amp;quot;{k} &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    except ValueError as e:&lt;br /&gt;
        with open(&amp;quot;nivelebinOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(str(e))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0677_-_Nivele_Bin&amp;diff=9801</id>
		<title>0677 - Nivele Bin</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0677_-_Nivele_Bin&amp;diff=9801"/>
		<updated>2024-05-18T14:23:44Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Considerăm un arbore binar cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri în care fiecare nod este numerotat 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 conține o valoare număr natural. În acest arbore rădăcina este considerată pe nivelul &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, descendenții direcți ai rădăcinii pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, etc. Să se determine numărul de nivele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; din arbore și, pentru fiecare nivel &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; de la &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, numărul de noduri situate pe acel nivel.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nivelebinIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Fiecare dintre următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii conține câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; numere &amp;lt;code&amp;gt;X st dr&amp;lt;/code&amp;gt;; linia &amp;lt;code&amp;gt;i + 1&amp;lt;/code&amp;gt; din fișier conține informațiile despre nodul numerotat cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; reprezintă valoare din nod, &amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; reprezintă numărul de ordine al descendentului stâng sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; dacă nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; nu are descendent stâng, iar &amp;lt;code&amp;gt;dr&amp;lt;/code&amp;gt; reprezintă numărul de ordine al descendentului drept sau &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; dacă nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; nu are descendent drept.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nivelebinOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;k+1&amp;lt;/code&amp;gt; numere naturale separate prin exact un spațiu, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea număr reprezentând numărul de noduri situate pe nivelul &amp;lt;code&amp;gt;i-1&amp;lt;/code&amp;gt; din arbore.&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;
* valorile din nodurile arborelui vor fi mai mici sau egale cu &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;nivelebinIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 2 3 5&lt;br /&gt;
 6 0 6&lt;br /&gt;
 1 0 0&lt;br /&gt;
 7 1 2&lt;br /&gt;
 4 0 0&lt;br /&gt;
 10 0 0&lt;br /&gt;
&amp;lt;code&amp;gt;nivelebinOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 1 2 3&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Exemplul corespunde arborelui de mai jos, în care au fost marcate cu albastru valorile din noduri, iar cu roșu numerele de ordine ale nodurilor.&lt;br /&gt;
&lt;br /&gt;
Arborele conține trei nivele:&lt;br /&gt;
&lt;br /&gt;
* nivelul &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; conține doar rădăcina, nodul numerotat cu &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
* nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; conține două noduri, cele numerotate cu &amp;lt;code&amp;gt;1 2&amp;lt;/code&amp;gt;&lt;br /&gt;
* nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; conține trei noduri, cele numerotate cu &amp;lt;code&amp;gt;3 5 6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;nivelebinIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001&lt;br /&gt;
 2 3 5&lt;br /&gt;
 6 0 6&lt;br /&gt;
 1 0 0&lt;br /&gt;
 7 1 2&lt;br /&gt;
 4 0 0&lt;br /&gt;
 10 0 0&lt;br /&gt;
&amp;lt;code&amp;gt;nivelebinOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def completniv(k, niv, nivele, s, d):&lt;br /&gt;
    if k != 0:&lt;br /&gt;
        nivele[k] = niv&lt;br /&gt;
        completniv(s[k], niv + 1, nivele, s, d)&lt;br /&gt;
        completniv(d[k], niv + 1, nivele, s, d)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, noduri):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    for x, s, d in noduri:&lt;br /&gt;
        if x &amp;gt; 1000000 or s &amp;gt; 1000000 or d &amp;gt; 1000000:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;nivelebinIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            n = int(fin.readline().strip())&lt;br /&gt;
            noduri = [tuple(map(int, fin.readline().strip().split())) for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
            if not verifica_restrictii(n, noduri):&lt;br /&gt;
                raise ValueError(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            s = [0] * (n + 1)&lt;br /&gt;
            d = [0] * (n + 1)&lt;br /&gt;
            p = [0] * (n + 1)&lt;br /&gt;
            nivele = [0] * (n + 1)&lt;br /&gt;
            &lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                x, s[i], d[i] = noduri[i-1]&lt;br /&gt;
                p[s[i]] = 1&lt;br /&gt;
                p[d[i]] = 1&lt;br /&gt;
&lt;br /&gt;
            r = 0&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                if p[i] == 0:&lt;br /&gt;
                    r = i&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
            completniv(r, 0, nivele, s, d)&lt;br /&gt;
            &lt;br /&gt;
            nivmax = max(nivele)&lt;br /&gt;
&lt;br /&gt;
            with open(&amp;quot;nivelebinOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                fout.write(f&amp;quot;{nivmax + 1}\n&amp;quot;)&lt;br /&gt;
                for niv in range(nivmax + 1):&lt;br /&gt;
                    k = sum(1 for j in range(1, n + 1) if nivele[j] == niv)&lt;br /&gt;
                    fout.write(f&amp;quot;{k} &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    except ValueError as e:&lt;br /&gt;
        with open(&amp;quot;nivelebinOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(str(e))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3724_-_Dreptunghi_2&amp;diff=9800</id>
		<title>3724 - Dreptunghi 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3724_-_Dreptunghi_2&amp;diff=9800"/>
		<updated>2024-05-18T14:18:10Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Avem la dispoziție un dreptunghi de dimensiuni &amp;lt;code&amp;gt;N x M&amp;lt;/code&amp;gt;. Ne este util ca dreptunghiul nostru să se asemene cu o matrice, de aceea vom considera că are &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. Vom segmenta si numerota dreptunghiul nostru după un anumit cod &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;. Prin segmentare se înțelege trasarea unei linii orizontale sau verticale la o anumită poziție &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, ce va despărți dreptunghiul nostru în alte două dreptunghiuri mai mici:&lt;br /&gt;
&lt;br /&gt;
* de dimensiuni &amp;lt;code&amp;gt;k x M&amp;lt;/code&amp;gt; (cel de sus) și &amp;lt;code&amp;gt;(N - k) x M&amp;lt;/code&amp;gt; (cel de jos) – în cazul unei linii (H)orizontale, operație codificată prin &amp;lt;code&amp;gt;Hk&amp;lt;/code&amp;gt;&lt;br /&gt;
* de dimensiuni &amp;lt;code&amp;gt;N x k&amp;lt;/code&amp;gt; (cel din stânga) și &amp;lt;code&amp;gt;N x (M - k)&amp;lt;/code&amp;gt; (cel din dreapta) – în cazul unei linii &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;erticale, operație codificată prin &amp;lt;code&amp;gt;Vk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Numerotarea dreptunghiului se realizează cu numerele naturale &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;, … în această ordine.&lt;br /&gt;
&lt;br /&gt;
Codul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; pentru segmentarea și numerotarea unui dreptunghi se definește recursiv. Dacă &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt; sunt coduri de segmentare și numerotare, atunci:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; – în fiecare căsuță a dreptunghiului se va scrie valoarea curentă a numerotării. După aceea, această valoare este incrementată pentru a fi folosită de o ulterioară operație de tipul &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;HkC1C2&amp;lt;/code&amp;gt; – se trasează linia orizontală la poziția &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, se segmentează și numerotează dreptunghiul de sus conform codului &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;, apoi se continuă cu segmentarea și numerotarea dreptunghiului de jos conform codului &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;VkC1C2&amp;lt;/code&amp;gt; – se trasează linia verticală la poziția &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, se segmentează și numerotează dreptunghiul din stânga conform codului &amp;lt;code&amp;gt;C1&amp;lt;/code&amp;gt;, apoi se continuă cu segmentarea și numerotarea dreptunghiului din dreapta conform codului &amp;lt;code&amp;gt;C2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De exemplu, dreptunghiul de dimensiuni &amp;lt;code&amp;gt;8 x 6&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; linii, &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; coloane) segmentat și numerotat conform codului &amp;lt;code&amp;gt;C = H5H3V2**V3**V5V2***&amp;lt;/code&amp;gt;, va arăta ca în Figura 1.&lt;br /&gt;
&lt;br /&gt;
Un cod de segmentare și numerotare &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; este valid pentru un dreptunghi de dimensiuni &amp;lt;code&amp;gt;N x M&amp;lt;/code&amp;gt; dacă și numai dacă pentru fiecare operație de tipul &amp;lt;code&amp;gt;HkC1C2&amp;lt;/code&amp;gt; și de tipul &amp;lt;code&amp;gt;VkC1C2&amp;lt;/code&amp;gt; din cadrul lui &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, poziția &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; la care se trage linia orizontală, sau verticală respectiv, se află strict în interiorul dreptunghiului curent (adică pe ambele părți ale liniei trasate există cel puțin o linie si cel puțin o coloană rămase care vor fi ulterior numerotate conform definiției recursive a codului &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Un cod de segmentare și numerotare &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; valid pentru un dreptunghi de dimensiuni &amp;lt;code&amp;gt;N x M&amp;lt;/code&amp;gt; generează mai multe subdiviziuni (dreptunghiuri mai mici) delimitate de liniile orizontale și verticale trasate în cadrul lui &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;. De exemplu, pentru dreptunghiul din Figura 1 codul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; din exemplul de mai sus generează &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; subdiviziuni.&lt;br /&gt;
&lt;br /&gt;
Codul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; nu este unic determinat. Pentru dreptunghiul segmentat și numerotat din Figura 1 există &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; coduri echivalente, pe care le scriem în ordine lexicografică în cele ce urmează:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;H3V2**H2V3**V2*V3**&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;H3V2**H2V3**V5V2***&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;code&amp;gt;H5H3V2**V3**V2*V3**&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;code&amp;gt;H5H3V2**V3**V5V2***&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru stabilirea ordinii lexicografice a două codificări, fiecare informație compactă ce face parte din secvență se va considera entitate separată: adică simbolurile &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; de tip caracter, respectiv numerele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; de tip întreg, indiferent de numărul de cifre din care sunt formate.&lt;br /&gt;
&lt;br /&gt;
La nivel de caractere ordinea lexicografică este &amp;lt;code&amp;gt;H &amp;lt; V &amp;lt; *&amp;lt;/code&amp;gt;. Numerele se vor compara în funcție de valoarea lor, de exemplu &amp;lt;code&amp;gt;1 &amp;lt; 7 &amp;lt; 12&amp;lt;/code&amp;gt;. Vom considera că un caracter este mai mic lexicografic decât un număr întreg.&lt;br /&gt;
&lt;br /&gt;
De exemplu, următoarele două coduri echivalente sunt scrise în ordine lexicografică:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;V7*V6**&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;code&amp;gt;V13V7***&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
și corespund dreptunghiului de mai jos:&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă un cod de segmentare și numerotare și se cere să se afle:&lt;br /&gt;
&lt;br /&gt;
1. numărul de subdiviziuni pe care acesta le generează;&lt;br /&gt;
&lt;br /&gt;
2. dimensiunile unui dreptunghi de arie minimă pentru care acest cod este valid;&lt;br /&gt;
&lt;br /&gt;
3. numărul de codificări distincte modulo &amp;lt;code&amp;gt;1.000.000.007&amp;lt;/code&amp;gt;, echivalente cu codul citit (în acest număr va fi inclus și codul inițial);&lt;br /&gt;
&lt;br /&gt;
4. primul cod în ordine lexicografică echivalent cu cel dat.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
De la intrarea standard se vor citi:&lt;br /&gt;
&lt;br /&gt;
* de pe prima linie valoarea lui &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;;&lt;br /&gt;
* de pe linia următoare un șir de caractere reprezentând codul de segmentare și numerotare &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
&lt;br /&gt;
* Dacă valoarea citită pentru &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, atunci la ieșirea standard se va tipări numărul de subdiviziuni pe care codul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; le generează;&lt;br /&gt;
* Dacă valoarea citită pentru &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, atunci la ieșirea standard se vor tipări 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; separate printr-un spațiu, dimensiunile unui dreptunghi de arie minimă pentru care codul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; citit este valid. În caz că există mai multe, se acceptă oricare;&lt;br /&gt;
* Dacă valoarea citită pentru &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, atunci la ieșirea standard se va tipări numărul de codificări distincte modulo &amp;lt;code&amp;gt;1.000.000.007&amp;lt;/code&amp;gt; echivalente cu codul citit (în acest număr va fi inclus și codul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; citit).&lt;br /&gt;
* Dacă valoarea citită pentru &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, atunci la ieșirea standard se va tipări primul cod în ordine lexicografică echivalent cu cel dat;&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; lungimea codului C (număr de caractere) &amp;lt; 350&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru teste în valoare de 14 puncte avem &amp;lt;code&amp;gt;P = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru teste în valoare de 21 de puncte avem &amp;lt;code&amp;gt;P = 2&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru teste în valoare de 29 de puncte avem &amp;lt;code&amp;gt;P = 3&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru teste în valoare de 36 de puncte avem &amp;lt;code&amp;gt;P = 4&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 1&lt;br /&gt;
 H3V2**H2V3**V2*V3**&lt;br /&gt;
Ieșire&lt;br /&gt;
 7&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
În urma segmentării se obțin &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; dreptunghiuri.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 2&lt;br /&gt;
 H3V2**H2V3**V2*V3**&lt;br /&gt;
Ieșire&lt;br /&gt;
 6 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Cel mai mic dreptunghi pentru care codul este valid are &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; linii și &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; coloane.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1000000007&lt;br /&gt;
&lt;br /&gt;
class RetType:&lt;br /&gt;
    def __init__(self, type, offset, cnt, s1, s2):&lt;br /&gt;
        self.type = type&lt;br /&gt;
        self.offset = offset&lt;br /&gt;
        self.cnt = cnt&lt;br /&gt;
        self.s1 = s1&lt;br /&gt;
        self.s2 = s2&lt;br /&gt;
&lt;br /&gt;
sir = &amp;quot;&amp;quot;&lt;br /&gt;
din = [0] * 355&lt;br /&gt;
pos = 0&lt;br /&gt;
cntDrept = 0&lt;br /&gt;
cntStr = 1&lt;br /&gt;
lenH = 0&lt;br /&gt;
lenV = 0&lt;br /&gt;
&lt;br /&gt;
def parseInt():&lt;br /&gt;
    global pos&lt;br /&gt;
    s = 0&lt;br /&gt;
    while pos &amp;lt; len(sir) and &#039;0&#039; &amp;lt;= sir[pos] &amp;lt;= &#039;9&#039;:&lt;br /&gt;
        s = s * 10 + int(sir[pos]) - int(&#039;0&#039;)&lt;br /&gt;
        pos += 1&lt;br /&gt;
    return s&lt;br /&gt;
&lt;br /&gt;
def solve(h, v):&lt;br /&gt;
    global pos, cntDrept, cntStr, lenH, lenV, din&lt;br /&gt;
    currType = sir[pos]&lt;br /&gt;
    pos += 1&lt;br /&gt;
    if currType == &#039;*&#039;:&lt;br /&gt;
        cntDrept += 1&lt;br /&gt;
        lenH = max(lenH, h + 1)&lt;br /&gt;
        lenV = max(lenV, v + 1)&lt;br /&gt;
        return RetType(&#039;*&#039;, 0, 0, &amp;quot;&amp;quot;, &amp;quot;*&amp;quot;)&lt;br /&gt;
    k = parseInt()&lt;br /&gt;
    ret = RetType(currType, k, 1, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    aux1 = solve(h, v)&lt;br /&gt;
    if aux1.type == currType:&lt;br /&gt;
        ret.cnt += aux1.cnt&lt;br /&gt;
        ret.s1 += aux1.s1&lt;br /&gt;
        ret.s1 += currType&lt;br /&gt;
        ret.s1 += str(k - aux1.offset)&lt;br /&gt;
        ret.s1 += aux1.s2&lt;br /&gt;
    else:&lt;br /&gt;
        cntStr = (1 * cntStr * din[aux1.cnt]) % MOD&lt;br /&gt;
        ret.s1 += currType&lt;br /&gt;
        ret.s1 += str(k)&lt;br /&gt;
        ret.s1 += aux1.s1 + aux1.s2&lt;br /&gt;
&lt;br /&gt;
    newH = h&lt;br /&gt;
    newV = v&lt;br /&gt;
    if currType == &#039;H&#039;:&lt;br /&gt;
        newH += k&lt;br /&gt;
    else:&lt;br /&gt;
        newV += k&lt;br /&gt;
    aux2 = solve(newH, newV)&lt;br /&gt;
    if aux2.type == currType:&lt;br /&gt;
        ret.cnt += aux2.cnt&lt;br /&gt;
        ret.offset += aux2.offset&lt;br /&gt;
        ret.s1 += aux2.s1&lt;br /&gt;
        ret.s2 += aux2.s2&lt;br /&gt;
    else:&lt;br /&gt;
        cntStr = (1 * cntStr * din[aux2.cnt]) % MOD&lt;br /&gt;
        ret.s2 += aux2.s1 + aux2.s2&lt;br /&gt;
&lt;br /&gt;
    return ret&lt;br /&gt;
&lt;br /&gt;
def restrictii(type, sir):&lt;br /&gt;
    if not (1 &amp;lt;= type &amp;lt;= 4):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt; len(sir) &amp;lt; 350):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global pos, sir, cntStr, din&lt;br /&gt;
    type = int(input())&lt;br /&gt;
    sir = input().strip()&lt;br /&gt;
    &lt;br /&gt;
    if not restrictii(type, sir):&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    din[0] = din[1] = 1&lt;br /&gt;
    for i in range(2, 351):&lt;br /&gt;
        din[i] = 0&lt;br /&gt;
        for j in range(i):&lt;br /&gt;
            din[i] = (din[i] + 1 * din[j] * din[i - j - 1]) % MOD&lt;br /&gt;
    &lt;br /&gt;
    aux = solve(0, 0)&lt;br /&gt;
    cntStr = (1 * cntStr * din[aux.cnt]) % MOD&lt;br /&gt;
    &lt;br /&gt;
    if type == 1:&lt;br /&gt;
        print(cntDrept)&lt;br /&gt;
    elif type == 2:&lt;br /&gt;
        print(lenH, lenV)&lt;br /&gt;
    elif type == 3:&lt;br /&gt;
        print(cntStr)&lt;br /&gt;
    else:&lt;br /&gt;
        print(aux.s1 + aux.s2)&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4203_-_Number_of_Points&amp;diff=9799</id>
		<title>4203 - Number of Points</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4203_-_Number_of_Points&amp;diff=9799"/>
		<updated>2024-05-18T14:15:29Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În planul &amp;lt;code&amp;gt;xOy&amp;lt;/code&amp;gt; se găsesc &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; puncte de coordonate numere naturale nenule, nu neapărat aflate pe poziții distincte.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Pentru fiecare punct din plan de coordonate &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt; trebuie să spuneți câte alte puncte au coordonatele &amp;lt;code&amp;gt;(p, q)&amp;lt;/code&amp;gt; cu proprietatea că &amp;lt;code&amp;gt;1 ≤ p &amp;lt; x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1 ≤ q ≤ y&amp;lt;/code&amp;gt; (atenție, &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este strict mai mic decât &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, iar &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; este mai mic sau egal cu &amp;lt;code&amp;gt;y&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;numberofpointsIN.txt&amp;lt;/code&amp;gt; conține pe prima linie, separate prin câte un spațiu, numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &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;, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y2&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; este numărul de puncte din plan, &amp;lt;code&amp;gt;(x1, y1)&amp;lt;/code&amp;gt; sunt coordonatele primului punct din plan, iar &amp;lt;code&amp;gt;(x2, y2)&amp;lt;/code&amp;gt; sunt coordonatele celui de-al doilea punct. Coordonatele restului punctelor se generează după formulele:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;xi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= (xi-2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;* A + xi-1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;* B + C) % D + 1&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;i=3..n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;yi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= (yi-2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;* A + yi-1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;* B + C) % D + 1&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;i=3..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;numberofpointsOUT.txt&amp;lt;/code&amp;gt; va conține exact &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii, pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; (cu &amp;lt;code&amp;gt;i = 1..n&amp;lt;/code&amp;gt;) se va afla un singur număr natural reprezentând numărul de puncte care au abscisa strict mai mică decât &amp;lt;code&amp;gt;xi&amp;lt;/code&amp;gt; și ordonata mai mică sau egală decât &amp;lt;code&amp;gt;yi&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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 ≤ A, B, C, D, x1, y1, x2, y2 ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;numberofpointsIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 19 17 11 23 4 5 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;numberofpointsOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 0&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
=== Explicații ===&lt;br /&gt;
Cele șapte puncte generate au coordonatele: &amp;lt;code&amp;gt;(4, 5)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(7, 2)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(23, 3)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(7, 9)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(16, 15)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(3, 1)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(22, 15)&amp;lt;/code&amp;gt;. Primul punct, de coordonate &amp;lt;code&amp;gt;(4, 5)&amp;lt;/code&amp;gt; are un singur punct care îndeplinește cerințele, anume cel de coordonate &amp;lt;code&amp;gt;(3, 1)&amp;lt;/code&amp;gt;. Al cincilea punct, de coordonate &amp;lt;code&amp;gt;(16, 15)&amp;lt;/code&amp;gt; are &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; puncte care îndeplinesc condițiile, anume &amp;lt;code&amp;gt;(4, 5)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(7, 2)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(7, 9)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(3, 1)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;numberofpointsIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 19 17 11 23 4 5 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;numberofpointsOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def read_input(file):&lt;br /&gt;
    with open(file, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        data = f.read().split()&lt;br /&gt;
    return list(map(int, data))&lt;br /&gt;
&lt;br /&gt;
def write_output(file, data):&lt;br /&gt;
    with open(file, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(data)&lt;br /&gt;
&lt;br /&gt;
class Punct:&lt;br /&gt;
    def __init__(self, x, y, ind):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.ind = ind&lt;br /&gt;
&lt;br /&gt;
def csort(a, b):&lt;br /&gt;
    if a.x != b.x:&lt;br /&gt;
        return a.x - b.x&lt;br /&gt;
    return a.y - b.y&lt;br /&gt;
&lt;br /&gt;
def update(tree, node, st, dr, poz):&lt;br /&gt;
    if st == dr:&lt;br /&gt;
        tree[node] += 1&lt;br /&gt;
        return&lt;br /&gt;
    mid = (st + dr) // 2&lt;br /&gt;
    if poz &amp;lt;= mid:&lt;br /&gt;
        update(tree, 2 * node, st, mid, poz)&lt;br /&gt;
    else:&lt;br /&gt;
        update(tree, 2 * node + 1, mid + 1, dr, poz)&lt;br /&gt;
    tree[node] = tree[2 * node] + tree[2 * node + 1]&lt;br /&gt;
&lt;br /&gt;
def query(tree, node, st, dr, val):&lt;br /&gt;
    if dr &amp;lt;= val:&lt;br /&gt;
        return tree[node]&lt;br /&gt;
    if st == dr:&lt;br /&gt;
        return 0&lt;br /&gt;
    mid = (st + dr) // 2&lt;br /&gt;
    q1 = query(tree, 2 * node, st, mid, val)&lt;br /&gt;
    q2 = 0&lt;br /&gt;
    if val &amp;gt; mid:&lt;br /&gt;
        q2 = query(tree, 2 * node + 1, mid + 1, dr, val)&lt;br /&gt;
    return q1 + q2&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, A, B, C, D):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 200000 and 1 &amp;lt;= A &amp;lt;= 1000000 and 1 &amp;lt;= B &amp;lt;= 1000000 and 1 &amp;lt;= C &amp;lt;= 1000000 and 1 &amp;lt;= D &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    data = read_input(&amp;quot;numberofpointsIN.txt&amp;quot;)&lt;br /&gt;
    n, A, B, C, D = data[0], data[1], data[2], data[3], data[4]&lt;br /&gt;
    &lt;br /&gt;
    if not verifica_restrictii(n, A, B, C, D):&lt;br /&gt;
        write_output(&amp;quot;numberofpointsOUT.txt&amp;quot;, &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    v = []&lt;br /&gt;
    idx = 5&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if i &amp;lt;= 2:&lt;br /&gt;
            x, y = data[idx], data[idx + 1]&lt;br /&gt;
            idx += 2&lt;br /&gt;
        else:&lt;br /&gt;
            x = (v[i - 3].x * A + v[i - 2].x * B + C) % D + 1&lt;br /&gt;
            y = (v[i - 3].y * A + v[i - 2].y * B + C) % D + 1&lt;br /&gt;
        v.append(Punct(x, y, i))&lt;br /&gt;
    &lt;br /&gt;
    v.sort(key=lambda p: (p.x, p.y))&lt;br /&gt;
    &lt;br /&gt;
    CMAX = 1000000&lt;br /&gt;
    tree = [0] * (4 * CMAX + 1)&lt;br /&gt;
    ans = [0] * (n + 1)&lt;br /&gt;
    same_x = [0] * (CMAX + 1)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        ans[v[i].ind] = query(tree, 1, 1, CMAX, v[i].y) - same_x[v[i].x]&lt;br /&gt;
        same_x[v[i].x] += 1&lt;br /&gt;
        update(tree, 1, 1, CMAX, v[i].y)&lt;br /&gt;
    &lt;br /&gt;
    output = &amp;quot;\n&amp;quot;.join(map(str, ans[1:]))&lt;br /&gt;
    write_output(&amp;quot;numberofpointsOUT.txt&amp;quot;, output)&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4203_-_Number_of_Points&amp;diff=9798</id>
		<title>4203 - Number of Points</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4203_-_Number_of_Points&amp;diff=9798"/>
		<updated>2024-05-18T14:15:17Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;În planul &amp;lt;code&amp;gt;xOy&amp;lt;/code&amp;gt; se găsesc &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; puncte de coordonate numere naturale nenule, nu neapărat aflate pe poziții distincte.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Pentru fiecare punct din plan de coordonate &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt; trebuie să spuneți câte alte puncte au coordonatele &amp;lt;code&amp;gt;(p, q)&amp;lt;/code&amp;gt; cu proprietatea că &amp;lt;code&amp;gt;1 ≤ p &amp;lt; x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1 ≤ q ≤ y&amp;lt;/code&amp;gt; (atenție, &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este strict mai mic decât &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, iar &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; este mai mic sau egal cu &amp;lt;code&amp;gt;y&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;numberofpointsIN.txt&amp;lt;/code&amp;gt; conține pe prima linie, separate prin câte un spațiu, numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &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;, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y2&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; este numărul de puncte din plan, &amp;lt;code&amp;gt;(x1, y1)&amp;lt;/code&amp;gt; sunt coordonatele primului punct din plan, iar &amp;lt;code&amp;gt;(x2, y2)&amp;lt;/code&amp;gt; sunt coordonatele celui de-al doilea punct. Coordonatele restului punctelor se generează după formulele:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;xi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= (xi-2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;* A + xi-1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;* B + C) % D + 1&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;i=3..n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;yi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= (yi-2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;* A + yi-1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;* B + C) % D + 1&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;i=3..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;numberofpointsOUT.txt&amp;lt;/code&amp;gt; va conține exact &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii, pe linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; (cu &amp;lt;code&amp;gt;i = 1..n&amp;lt;/code&amp;gt;) se va afla un singur număr natural reprezentând numărul de puncte care au abscisa strict mai mică decât &amp;lt;code&amp;gt;xi&amp;lt;/code&amp;gt; și ordonata mai mică sau egală decât &amp;lt;code&amp;gt;yi&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;
* &amp;lt;code&amp;gt;1 ≤ A, B, C, D, x1, y1, x2, y2 ≤ 1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;numberofpointsIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 19 17 11 23 4 5 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;numberofpointsOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 0&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
=== Explicații ===&lt;br /&gt;
Cele șapte puncte generate au coordonatele: &amp;lt;code&amp;gt;(4, 5)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(7, 2)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(23, 3)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(7, 9)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(16, 15)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(3, 1)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(22, 15)&amp;lt;/code&amp;gt;. Primul punct, de coordonate &amp;lt;code&amp;gt;(4, 5)&amp;lt;/code&amp;gt; are un singur punct care îndeplinește cerințele, anume cel de coordonate &amp;lt;code&amp;gt;(3, 1)&amp;lt;/code&amp;gt;. Al cincilea punct, de coordonate &amp;lt;code&amp;gt;(16, 15)&amp;lt;/code&amp;gt; are &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; puncte care îndeplinesc condițiile, anume &amp;lt;code&amp;gt;(4, 5)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(7, 2)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(7, 9)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(3, 1)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;numberofpointsIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 19 17 11 23 4 5 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;numberofpointsOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def read_input(file):&lt;br /&gt;
    with open(file, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        data = f.read().split()&lt;br /&gt;
    return list(map(int, data))&lt;br /&gt;
&lt;br /&gt;
def write_output(file, data):&lt;br /&gt;
    with open(file, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(data)&lt;br /&gt;
&lt;br /&gt;
class Punct:&lt;br /&gt;
    def __init__(self, x, y, ind):&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
        self.ind = ind&lt;br /&gt;
&lt;br /&gt;
def csort(a, b):&lt;br /&gt;
    if a.x != b.x:&lt;br /&gt;
        return a.x - b.x&lt;br /&gt;
    return a.y - b.y&lt;br /&gt;
&lt;br /&gt;
def update(tree, node, st, dr, poz):&lt;br /&gt;
    if st == dr:&lt;br /&gt;
        tree[node] += 1&lt;br /&gt;
        return&lt;br /&gt;
    mid = (st + dr) // 2&lt;br /&gt;
    if poz &amp;lt;= mid:&lt;br /&gt;
        update(tree, 2 * node, st, mid, poz)&lt;br /&gt;
    else:&lt;br /&gt;
        update(tree, 2 * node + 1, mid + 1, dr, poz)&lt;br /&gt;
    tree[node] = tree[2 * node] + tree[2 * node + 1]&lt;br /&gt;
&lt;br /&gt;
def query(tree, node, st, dr, val):&lt;br /&gt;
    if dr &amp;lt;= val:&lt;br /&gt;
        return tree[node]&lt;br /&gt;
    if st == dr:&lt;br /&gt;
        return 0&lt;br /&gt;
    mid = (st + dr) // 2&lt;br /&gt;
    q1 = query(tree, 2 * node, st, mid, val)&lt;br /&gt;
    q2 = 0&lt;br /&gt;
    if val &amp;gt; mid:&lt;br /&gt;
        q2 = query(tree, 2 * node + 1, mid + 1, dr, val)&lt;br /&gt;
    return q1 + q2&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, A, B, C, D):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 200000 and 1 &amp;lt;= A &amp;lt;= 1000000 and 1 &amp;lt;= B &amp;lt;= 1000000 and 1 &amp;lt;= C &amp;lt;= 1000000 and 1 &amp;lt;= D &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    data = read_input(&amp;quot;numberofpointsIN.txt&amp;quot;)&lt;br /&gt;
    n, A, B, C, D = data[0], data[1], data[2], data[3], data[4]&lt;br /&gt;
    &lt;br /&gt;
    if not verifica_restrictii(n, A, B, C, D):&lt;br /&gt;
        write_output(&amp;quot;numberofpointsOUT.txt&amp;quot;, &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    v = []&lt;br /&gt;
    idx = 5&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if i &amp;lt;= 2:&lt;br /&gt;
            x, y = data[idx], data[idx + 1]&lt;br /&gt;
            idx += 2&lt;br /&gt;
        else:&lt;br /&gt;
            x = (v[i - 3].x * A + v[i - 2].x * B + C) % D + 1&lt;br /&gt;
            y = (v[i - 3].y * A + v[i - 2].y * B + C) % D + 1&lt;br /&gt;
        v.append(Punct(x, y, i))&lt;br /&gt;
    &lt;br /&gt;
    v.sort(key=lambda p: (p.x, p.y))&lt;br /&gt;
    &lt;br /&gt;
    CMAX = 1000000&lt;br /&gt;
    tree = [0] * (4 * CMAX + 1)&lt;br /&gt;
    ans = [0] * (n + 1)&lt;br /&gt;
    same_x = [0] * (CMAX + 1)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        ans[v[i].ind] = query(tree, 1, 1, CMAX, v[i].y) - same_x[v[i].x]&lt;br /&gt;
        same_x[v[i].x] += 1&lt;br /&gt;
        update(tree, 1, 1, CMAX, v[i].y)&lt;br /&gt;
    &lt;br /&gt;
    output = &amp;quot;\n&amp;quot;.join(map(str, ans[1:]))&lt;br /&gt;
    write_output(&amp;quot;numberofpointsOUT.txt&amp;quot;, output)&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4267_-_Perechi_Puncte&amp;diff=9797</id>
		<title>4267 - Perechi Puncte</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4267_-_Perechi_Puncte&amp;diff=9797"/>
		<updated>2024-05-18T14:09:57Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se dau &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; puncte în plan, nu neapărat distincte, fiecare punct fiind dat prin coordonatele sale &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; sunt numere naturale. Spunem că două puncte &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(i, j)&amp;lt;/code&amp;gt; sunt simetrice dacă &amp;lt;code&amp;gt;x = j&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y = i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se determine numărul perechilor de puncte simetrice.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură, separate prin spații, numerele naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y2&amp;lt;/code&amp;gt;, &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;, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; este numărul de puncte, &amp;lt;code&amp;gt;(x1, y1)&amp;lt;/code&amp;gt; sunt coordonatele primului punct, &amp;lt;code&amp;gt;(x2, y2)&amp;lt;/code&amp;gt; sunt coordonatele celui de-al doilea punct, iar restul punctelor &amp;lt;code&amp;gt;(x[i], y[i])&amp;lt;/code&amp;gt; se generează după formulele:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;x[i] = (x[i - 1] * A + x[i - 2] * B + C) % D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;i = 3..n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;y[i] = (y[i - 1] * A + y[i - 2] * B + C) % D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;i = 3..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 perechilor de puncte simetrice.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;10 ≤ n ≤ 6.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ x1, y1, x2, y2 ≤ 30.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ A, B, C, D ≤ 30.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Punctele generate nu sunt neapărat distincte. Dacă de exemplu se generează de &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; ori punctul &amp;lt;code&amp;gt;(2,9)&amp;lt;/code&amp;gt; și de &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; ori punctul &amp;lt;code&amp;gt;(9,2)&amp;lt;/code&amp;gt;, atunci se obțin &amp;lt;code&amp;gt;5 * 7 = 35&amp;lt;/code&amp;gt; de perechi simetrice.&lt;br /&gt;
* Simetricul punctului &amp;lt;code&amp;gt;(x, x)&amp;lt;/code&amp;gt; este un alt punct &amp;lt;code&amp;gt;(x, x)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
Intrare&lt;br /&gt;
 15 2 3 5 2 30 20 50 100&lt;br /&gt;
Ieșire&lt;br /&gt;
 55&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, X, Y, X_, Y_, a, b, c, d):&lt;br /&gt;
    if not (10 &amp;lt;= n &amp;lt;= 6000000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt;= X &amp;lt;= 30000 and 0 &amp;lt;= Y &amp;lt;= 30000 and 0 &amp;lt;= X_ &amp;lt;= 30000 and 0 &amp;lt;= Y_ &amp;lt;= 30000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (2 &amp;lt;= a &amp;lt;= 30000 and 2 &amp;lt;= b &amp;lt;= 30000 and 2 &amp;lt;= c &amp;lt;= 30000 and 2 &amp;lt;= d &amp;lt;= 30000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    data = input(&amp;quot;&amp;quot;).split()&lt;br /&gt;
    &lt;br /&gt;
    n = int(data[0])&lt;br /&gt;
    X = int(data[1])&lt;br /&gt;
    Y = int(data[2])&lt;br /&gt;
    X_ = int(data[3])&lt;br /&gt;
    Y_ = int(data[4])&lt;br /&gt;
    a = int(data[5])&lt;br /&gt;
    b = int(data[6])&lt;br /&gt;
    c = int(data[7])&lt;br /&gt;
    d = int(data[8])&lt;br /&gt;
    &lt;br /&gt;
    if not verifica_restrictii(n, X, Y, X_, Y_, a, b, c, d):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    from collections import defaultdict&lt;br /&gt;
    points = defaultdict(int)&lt;br /&gt;
    &lt;br /&gt;
    points[(X, Y)] += 1&lt;br /&gt;
    points[(X_, Y_)] += 1&lt;br /&gt;
    &lt;br /&gt;
    simetrice = 0&lt;br /&gt;
    &lt;br /&gt;
    if X == Y_ and Y == X_:&lt;br /&gt;
        simetrice += 1&lt;br /&gt;
    &lt;br /&gt;
    for i in range(3, n + 1):&lt;br /&gt;
        x, y = X, Y&lt;br /&gt;
        X, Y = X_, Y_&lt;br /&gt;
        X_ = (X * a + x * b + c) % d&lt;br /&gt;
        Y_ = (Y * a + y * b + c) % d&lt;br /&gt;
        &lt;br /&gt;
        simetrice += points[(Y_, X_)]&lt;br /&gt;
        points[(X_, Y_)] += 1&lt;br /&gt;
    &lt;br /&gt;
    print(f&amp;quot;{simetrice}&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3897_-_Josephus_Sequence&amp;diff=9796</id>
		<title>3897 - Josephus Sequence</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3897_-_Josephus_Sequence&amp;diff=9796"/>
		<updated>2024-05-18T14:00:44Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Josephus este un matematician înrăit.&lt;br /&gt;
&lt;br /&gt;
Într-o zi acesta se joacă cu primele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere prime, când se decide să își construiască propiul său șir circular format din aceste numere. Pe prima poziție se va afla primul număr prim, adică &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, iar mai apoi se parcurge circular șirul din &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, completându-se cu restul de numere prime, până la repartizarea tuturor.&lt;br /&gt;
&lt;br /&gt;
Din nefericire lui Josephus, i-a venit somnul, așa, că vă roagă pe voi să îi construiți șirul.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;josephusIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și numărul &amp;lt;code&amp;gt;K&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;josephusOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale separate prin câte un spaţiu, reprezentând şirul lui Josephus. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* &amp;lt;code&amp;gt;1 ≤ K ≤ 1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cel de-al &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt; număr prim este &amp;lt;code&amp;gt;15.485.863&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;josephusIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 4&lt;br /&gt;
&amp;lt;code&amp;gt;josephusOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 5 11 7 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Distribuirea se face astfel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 5 11 7 3&amp;lt;/code&amp;gt; numărând din &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; în &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, începând cu primul termen, se obţine următoarea listă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 3 5 7 11&amp;lt;/code&amp;gt; reprezentând primele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; numere prime.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;josephusIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 4&lt;br /&gt;
&amp;lt;code&amp;gt;josephusOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def gen_primes(valMAX):&lt;br /&gt;
    prime = [False] * (valMAX + 1)&lt;br /&gt;
    primes = []&lt;br /&gt;
    prime[2] = True&lt;br /&gt;
    for i in range(3, valMAX + 1, 2):&lt;br /&gt;
        prime[i] = True&lt;br /&gt;
    &lt;br /&gt;
    for i in range(3, int(valMAX**0.5) + 1, 2):&lt;br /&gt;
        if prime[i]:&lt;br /&gt;
            for j in range(i*i, valMAX + 1, i + i):&lt;br /&gt;
                prime[j] = False&lt;br /&gt;
    &lt;br /&gt;
    primes.append(2)&lt;br /&gt;
    for i in range(3, valMAX + 1, 2):&lt;br /&gt;
        if prime[i]:&lt;br /&gt;
            primes.append(i)&lt;br /&gt;
    &lt;br /&gt;
    return primes&lt;br /&gt;
&lt;br /&gt;
def build_aib(n):&lt;br /&gt;
    aib = [0] * (n + 1)&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        aib[i] += 1&lt;br /&gt;
        if i + (i &amp;amp; -i) &amp;lt;= n:&lt;br /&gt;
            aib[i + (i &amp;amp; -i)] += aib[i]&lt;br /&gt;
    return aib&lt;br /&gt;
&lt;br /&gt;
def update_add_aib(aib, n, pos, val):&lt;br /&gt;
    while pos &amp;lt;= n:&lt;br /&gt;
        aib[pos] += val&lt;br /&gt;
        pos += (pos &amp;amp; -pos)&lt;br /&gt;
&lt;br /&gt;
def query_sum_aib(aib, pos):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    while pos &amp;gt;= 1:&lt;br /&gt;
        sum += aib[pos]&lt;br /&gt;
        pos -= (pos &amp;amp; -pos)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
def query_range_sum_aib(aib, le, ri):&lt;br /&gt;
    return query_sum_aib(aib, ri) - query_sum_aib(aib, le - 1)&lt;br /&gt;
&lt;br /&gt;
def bs_aib(aib, n, val, logn):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    pos = 0&lt;br /&gt;
    for i in range(logn, -1, -1):&lt;br /&gt;
        if pos + (1 &amp;lt;&amp;lt; i) &amp;lt;= n and sum + aib[pos + (1 &amp;lt;&amp;lt; i)] &amp;lt; val:&lt;br /&gt;
            sum += aib[pos + (1 &amp;lt;&amp;lt; i)]&lt;br /&gt;
            pos += (1 &amp;lt;&amp;lt; i)&lt;br /&gt;
    return pos + 1&lt;br /&gt;
&lt;br /&gt;
def put_int(x):&lt;br /&gt;
    sys.stdout.write(str(x) + &#039; &#039;)&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, k):&lt;br /&gt;
    return 1 &amp;lt;= n &amp;lt;= 1000000 and 1 &amp;lt;= k &amp;lt;= 1000000000&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;josephusIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, k = map(int, fin.read().split())&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;josephusOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        if not check_restrictions(n, k):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        valMAX = 15485863&lt;br /&gt;
        primes = gen_primes(valMAX)&lt;br /&gt;
        logn = 31 - (n).bit_length() + 1&lt;br /&gt;
        aib = build_aib(n)&lt;br /&gt;
        &lt;br /&gt;
        v = [0] * (n + 1)&lt;br /&gt;
        v[1] = 2&lt;br /&gt;
        update_add_aib(aib, n, 1, -1)&lt;br /&gt;
        &lt;br /&gt;
        st = 1&lt;br /&gt;
        for i in range(2, n + 1):&lt;br /&gt;
            ezk = (k - 1) % query_sum_aib(aib, n) + 1&lt;br /&gt;
            &lt;br /&gt;
            if query_range_sum_aib(aib, st, n) &amp;gt;= ezk:&lt;br /&gt;
                st = bs_aib(aib, n, ezk + query_sum_aib(aib, st - 1), logn)&lt;br /&gt;
            else:&lt;br /&gt;
                st = bs_aib(aib, n, ezk - query_range_sum_aib(aib, st, n), logn)&lt;br /&gt;
            &lt;br /&gt;
            v[st] = primes[i - 1]&lt;br /&gt;
            update_add_aib(aib, n, st, -1)&lt;br /&gt;
        &lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            fout.write(f&amp;quot;{v[i]} &amp;quot;)&lt;br /&gt;
        fout.write(&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1901_-_Median_Heaps&amp;diff=9795</id>
		<title>1901 - Median Heaps</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1901_-_Median_Heaps&amp;diff=9795"/>
		<updated>2024-05-18T13:50:57Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un vector de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale nenule, indexat de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se cere să se raspundă la &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; interogări de tipul:&lt;br /&gt;
&lt;br /&gt;
* pentru un interval &amp;lt;code&amp;gt;[l, r]&amp;lt;/code&amp;gt; din vector, aflați costul total mimin, al egalizării tuturor elementelor din interval.&lt;br /&gt;
&lt;br /&gt;
Într-un interval &amp;lt;code&amp;gt;[l, r]&amp;lt;/code&amp;gt;, puteți crește sau micșora fiecare element cu costul &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; unde &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; este diferența dintre valoarea nouă și valoarea inițială. Costul total este suma acestor costuri.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
&lt;br /&gt;
* pe prima linie numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* pe a doua linie &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale nenule : , , … .&lt;br /&gt;
* pe a treia linie numărul &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;.&lt;br /&gt;
* pe următoarele &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; linii &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; numere: &amp;lt;code&amp;gt;l, r&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;Q&amp;lt;/code&amp;gt; numere pe fiecare linie, reprezentând constul total minim, al fiecărui interval &amp;lt;code&amp;gt;l r&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, Q ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ l ≤ r ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤&amp;lt;/code&amp;gt;  &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;
 9&lt;br /&gt;
 3 2 16 15 12 6 20 4 5&lt;br /&gt;
 3&lt;br /&gt;
 2 7&lt;br /&gt;
 2 2&lt;br /&gt;
 3 8&lt;br /&gt;
Ieșire&lt;br /&gt;
 31&lt;br /&gt;
 0&lt;br /&gt;
 29&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Pentru intervalul &amp;lt;code&amp;gt;[2, 7]&amp;lt;/code&amp;gt;, costul total minim este &amp;lt;code&amp;gt;31&amp;lt;/code&amp;gt;, deoarece egalizăm fiecare număr din interval cu &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pentru intervalul &amp;lt;code&amp;gt;[2, 2]&amp;lt;/code&amp;gt;, costul total minim este &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, deoarece avem un singur element în interval.&lt;br /&gt;
&lt;br /&gt;
Pentru intervalul &amp;lt;code&amp;gt;[3, 8]&amp;lt;/code&amp;gt;, costul total minim este &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt;, deoarece egalizăm fiecare număr din interval cu &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
Nmax = 100001&lt;br /&gt;
&lt;br /&gt;
class Query:&lt;br /&gt;
    def __init__(self, st, dr, pos):&lt;br /&gt;
        self.st = st&lt;br /&gt;
        self.dr = dr&lt;br /&gt;
        self.pos = pos&lt;br /&gt;
&lt;br /&gt;
def update(aib, aibs, pos, val1, val2):&lt;br /&gt;
    while pos &amp;lt; Nmax:&lt;br /&gt;
        aib[pos] += val1&lt;br /&gt;
        aibs[pos] += val2&lt;br /&gt;
        pos += pos &amp;amp; -pos&lt;br /&gt;
&lt;br /&gt;
def query(aib, aibs, pos, c):&lt;br /&gt;
    sum_val = 0&lt;br /&gt;
    s = 0&lt;br /&gt;
    while pos &amp;gt; 0:&lt;br /&gt;
        sum_val += aib[pos]&lt;br /&gt;
        if aibs is not None:&lt;br /&gt;
            s += aibs[pos]&lt;br /&gt;
        pos -= pos &amp;amp; -pos&lt;br /&gt;
    return sum_val if c == 1 else s&lt;br /&gt;
&lt;br /&gt;
def add(k, N, V, S, aib, aibs):&lt;br /&gt;
    update(aib, aibs, N[k], 1, V[S[N[k]]])&lt;br /&gt;
&lt;br /&gt;
def delete(k, N, V, S, aib, aibs):&lt;br /&gt;
    update(aib, aibs, N[k], -1, -V[S[N[k]]])&lt;br /&gt;
&lt;br /&gt;
def binary_search(pos, n, aib):&lt;br /&gt;
    st, dr = 1, n&lt;br /&gt;
    ans = -1&lt;br /&gt;
    while st &amp;lt;= dr:&lt;br /&gt;
        mid = (st + dr) // 2&lt;br /&gt;
        q = query(aib, None, mid, 1)&lt;br /&gt;
        if q &amp;gt;= pos:&lt;br /&gt;
            dr = mid - 1&lt;br /&gt;
            ans = mid&lt;br /&gt;
        else:&lt;br /&gt;
            st = mid + 1&lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def verify_restrictions(n, q, ranges):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000 and 1 &amp;lt;= q &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    for l, r in ranges:&lt;br /&gt;
        if not (1 &amp;lt;= l &amp;lt;= r &amp;lt;= 100000):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    V = [0] * (n + 1)&lt;br /&gt;
    &lt;br /&gt;
    values = list(map(int, input().split()))&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        V[i] = values[i-1]&lt;br /&gt;
    &lt;br /&gt;
    q = int(input())&lt;br /&gt;
    ranges = []&lt;br /&gt;
    Q = []&lt;br /&gt;
    for i in range(1, q + 1):&lt;br /&gt;
        st, dr = map(int, input().split())&lt;br /&gt;
        ranges.append((st, dr))&lt;br /&gt;
        Q.append(Query(st, dr, i))&lt;br /&gt;
&lt;br /&gt;
    if not verify_restrictions(n, q, ranges):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    block = int(math.sqrt(n))&lt;br /&gt;
    S = list(range(n + 1))&lt;br /&gt;
    S[1:] = sorted(S[1:], key=lambda x: V[x])&lt;br /&gt;
    N = [0] * (n + 1)&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        N[S[i]] = i&lt;br /&gt;
&lt;br /&gt;
    Q.sort(key=lambda x: (x.dr // block, x.st if x.dr // block % 2 == 0 else -x.st))&lt;br /&gt;
    aib = [0] * Nmax&lt;br /&gt;
    aibs = [0] * Nmax&lt;br /&gt;
    Rez = [0] * (q + 1)&lt;br /&gt;
    &lt;br /&gt;
    st, dr = 1, 0&lt;br /&gt;
    for i in range(1, q + 1):&lt;br /&gt;
        s, d = Q[i-1].st, Q[i-1].dr&lt;br /&gt;
        while st &amp;lt; s:&lt;br /&gt;
            delete(st, N, V, S, aib, aibs)&lt;br /&gt;
            st += 1&lt;br /&gt;
        while st &amp;gt; s:&lt;br /&gt;
            st -= 1&lt;br /&gt;
            add(st, N, V, S, aib, aibs)&lt;br /&gt;
        while dr &amp;lt; d:&lt;br /&gt;
            dr += 1&lt;br /&gt;
            add(dr, N, V, S, aib, aibs)&lt;br /&gt;
        while dr &amp;gt; d:&lt;br /&gt;
            delete(dr, N, V, S, aib, aibs)&lt;br /&gt;
            dr -= 1&lt;br /&gt;
&lt;br /&gt;
        poss = (d - s + 2) // 2&lt;br /&gt;
        ans = binary_search(poss, n, aib)&lt;br /&gt;
        s1 = query(aib, aibs, n, 2)&lt;br /&gt;
        h1 = query(aib, None, n, 1)&lt;br /&gt;
        s2 = query(aib, aibs, ans, 2)&lt;br /&gt;
        h2 = query(aib, None, ans, 1)&lt;br /&gt;
        s1 -= s2&lt;br /&gt;
        h1 -= h2&lt;br /&gt;
&lt;br /&gt;
        Rez[Q[i-1].pos] = s1 - h1 * V[S[ans]] + (-s2 + h2 * V[S[ans]])&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, q + 1):&lt;br /&gt;
        print(Rez[i])&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1854_-_Arbore_Binar_Complet&amp;diff=9794</id>
		<title>1854 - Arbore Binar Complet</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1854_-_Arbore_Binar_Complet&amp;diff=9794"/>
		<updated>2024-05-18T13:41:39Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un arbore binar complet este un arbore binar în care toate nivelurile, cu excepția ultimului sunt ocupate în întregime. În general, deși nu este obligatoriu, toate nodurile de pe ultimul nivel sunt grupate în partea stânga a acestuia.&lt;br /&gt;
&lt;br /&gt;
Arborele binar de mai jos este complet:&lt;br /&gt;
&lt;br /&gt;
Înălțimea unui arbore binare complet este , unde  este numărul de noduri.&lt;br /&gt;
&lt;br /&gt;
Pentru reprezentarea unui arbore binar complet se poate folosi un tablou unidimensional &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; elemente, în felul următor:&lt;br /&gt;
&lt;br /&gt;
* rădăcinii arborelui îi corespunde elementul &amp;lt;code&amp;gt;A[1]&amp;lt;/code&amp;gt;;&lt;br /&gt;
* dacă unui nod îi corespunde elementul &amp;lt;code&amp;gt;A[k]&amp;lt;/code&amp;gt;, descendentului stâng îi va corespunde elementul &amp;lt;code&amp;gt;A[2*k]&amp;lt;/code&amp;gt;, iar celui drept îi va corespunde elementul &amp;lt;code&amp;gt;A[2*k+1]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Observăm că pentru un nod &amp;lt;code&amp;gt;A[k]&amp;lt;/code&amp;gt;, nodul părinte este &amp;lt;code&amp;gt;A[k/2]&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;k/2&amp;lt;/code&amp;gt; este câtul împărțirii, fără zecimale.&lt;br /&gt;
&lt;br /&gt;
Într-un arbore reprezentat astfel, nodurile de pe ultimul nivel sunt grupate în stânga. Dacă nodurile nu sunt grupate în stânga, sunt necesare câteva elemente în plus în vector, iar unele dintre ele nu vor fi folosite – nu vor avea un nod corespunzător.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dau &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale, reprezentând în ordine valorile nodurilor dintr-un arbore binar complet și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; operații de tip &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, aplicate unui nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Operația de tip &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; determină valoarea nodului părinte a lui &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar operația de tip &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; determină suma valorilor fiilor nodului &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Dacă &amp;lt;code&amp;gt;k=1&amp;lt;/code&amp;gt; sau dacă nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; nu are fii, rezultatul va fi &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Afișați pentru fiecare operație rezultatul ei.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;completIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, pe linia a doua &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale, pe linia a treia &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii câte o pereche &amp;lt;code&amp;gt;op k&amp;lt;/code&amp;gt;. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;completOUT.txt&amp;lt;/code&amp;gt; va conține rezultatele celor &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; operații, în ordine, câte unul pe linie.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere citite vor fi mai mici decât &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤ 100000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ op ≤ 2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;completIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 12&lt;br /&gt;
 15 5 18 35 32 23 12 43 29 25 22 13&lt;br /&gt;
 8&lt;br /&gt;
 2 9&lt;br /&gt;
 1 7&lt;br /&gt;
 2 5&lt;br /&gt;
 1 8&lt;br /&gt;
 1 1&lt;br /&gt;
 2 6&lt;br /&gt;
 1 9&lt;br /&gt;
 2 4 &lt;br /&gt;
&amp;lt;code&amp;gt;completOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0&lt;br /&gt;
 18&lt;br /&gt;
 47&lt;br /&gt;
 35&lt;br /&gt;
 0&lt;br /&gt;
 13&lt;br /&gt;
 35&lt;br /&gt;
 72&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 2: ===&lt;br /&gt;
&amp;lt;code&amp;gt;completIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0&lt;br /&gt;
 15 5 18 35 32 23 12 43 29 25 22 13&lt;br /&gt;
 8&lt;br /&gt;
 2 9&lt;br /&gt;
 1 7&lt;br /&gt;
 2 5&lt;br /&gt;
 1 8&lt;br /&gt;
 1 1&lt;br /&gt;
 2 6&lt;br /&gt;
 1 9&lt;br /&gt;
 2 4 &lt;br /&gt;
&amp;lt;code&amp;gt;completOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, m, operatii, arb):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(0 &amp;lt;= num &amp;lt; 1000000 for num in arb[1:]):  # index 0 este ignorat&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= m &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= op &amp;lt;= 2 and 1 &amp;lt;= k &amp;lt;= n for op, k in operatii):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;completIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        arb = [0] + list(map(int, fin.readline().strip().split()))&lt;br /&gt;
        m = int(fin.readline().strip())&lt;br /&gt;
        operatii = [tuple(map(int, fin.readline().strip().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(n, m, operatii, arb):&lt;br /&gt;
        with open(&amp;quot;completOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;completOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for op, k in operatii:&lt;br /&gt;
            if op == 1:&lt;br /&gt;
                if k == 1:&lt;br /&gt;
                    fout.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    fout.write(f&amp;quot;{arb[k//2]}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif op == 2:&lt;br /&gt;
                if k*2 &amp;gt; n and k*2+1 &amp;gt; n:&lt;br /&gt;
                    fout.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
                elif k*2 &amp;lt;= n and k*2+1 &amp;gt; n:&lt;br /&gt;
                    fout.write(f&amp;quot;{arb[k*2]}\n&amp;quot;)&lt;br /&gt;
                elif k*2 &amp;lt;= n and k*2+1 &amp;lt;= n:&lt;br /&gt;
                    fout.write(f&amp;quot;{arb[k*2] + arb[k*2+1]}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2338_-_Ski_Pass&amp;diff=9793</id>
		<title>2338 - Ski Pass</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2338_-_Ski_Pass&amp;diff=9793"/>
		<updated>2024-05-18T13:24:42Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
La un parc de sporturi de iarnă au venit &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; grupuri de schiori numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;. Aceștia coboară pe&lt;br /&gt;
&lt;br /&gt;
una dintre cele &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; pârtii disponibile dar urcă cu același teleschi. Teleschiul folosește T-bar-uri, o modalitate eficientă de a urca schiorii pe vârful pârtiei.&lt;br /&gt;
&lt;br /&gt;
Un T-bar poate trage maxim &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; schiori odată. Deoarece sunt &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; pârtii, se formează &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; rânduri de oameni de-o parte și de alta a punctului de urcare în teleschi. Se știe că &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; schiori nu vor folosi același T-bar decât dacă fac parte din același grup. De asemenea, niciun schior nu se baga în fața altuia (toți sunt foarte corecți și răbdători). Atunci când un T-bar sosește, primul om de la una dintre cozi se urcă în el și pleacă sau așteaptă să se&lt;br /&gt;
&lt;br /&gt;
urce încă cineva (din același grup cu el). Acest al doilea schior trebuie sa fie totuși primul de la coada lui (nimeni nu se bagă în față).&lt;br /&gt;
&lt;br /&gt;
Care este numărul minim de T-bar-uri ce trebuie folosite astfel încât toți schiorii de la ambele rânduri să ajungă în vârful pârtiei?&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;skipassIN.txt&amp;lt;/code&amp;gt; ​se află numărul de grupuri &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;. Pe următoarele două linii sunt descrise cele &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; cozi în felul următor: numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; de oameni de la acea coada urmat de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere reprezentând grupul din care face parte al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea schior (1&amp;lt;=i&amp;lt;=N).&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul de ieșire &amp;lt;code&amp;gt;skipassOUT.txt&amp;lt;/code&amp;gt; se află un singur număr reprezentând numărul minim de T-bar-uri ce trebuie&lt;br /&gt;
&lt;br /&gt;
folosite.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* ​&amp;lt;code&amp;gt;1 ≤ G ≤ 50&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 40% din punctaj una dintre cozi va fi formata doar din oameni din același grup.&lt;br /&gt;
* Pentru 60% din punctaj &amp;lt;code&amp;gt;N &amp;lt;= 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 90% din punctaj &amp;lt;code&amp;gt;N &amp;lt;= 300&amp;lt;/code&amp;gt;&lt;br /&gt;
* Atenție la limita de memorie!&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;skipassIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 6 1 2 1 3 3 4&lt;br /&gt;
 4 3 1 2 4&lt;br /&gt;
&amp;lt;code&amp;gt;skipassOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Schiorii urca în următoarea ordine:&lt;br /&gt;
&lt;br /&gt;
Primul de la a &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;-a coada singur&lt;br /&gt;
&lt;br /&gt;
Primii de la ambele cozi&lt;br /&gt;
&lt;br /&gt;
Primii de la ambele cozi&lt;br /&gt;
&lt;br /&gt;
Primul de la prima coada&lt;br /&gt;
&lt;br /&gt;
Primii &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; de la prima coada&lt;br /&gt;
&lt;br /&gt;
Primii de la ambele cozi&lt;br /&gt;
&lt;br /&gt;
= Exemplu 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;skipassIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 51&lt;br /&gt;
 6 1 2 1 3 3 4&lt;br /&gt;
 4 3 1 2 4&lt;br /&gt;
&amp;lt;code&amp;gt;skipassOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(g, n1, n2):&lt;br /&gt;
    if not (1 &amp;lt;= g &amp;lt;= 50 and 1 &amp;lt;= n1 &amp;lt;= 1000 and 1 &amp;lt;= n2 &amp;lt;= 1000):&lt;br /&gt;
        with open(&amp;quot;skipassOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citeste_datele(filename):&lt;br /&gt;
    with open(filename, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        g = int(fin.readline().strip())&lt;br /&gt;
        q1 = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
        q2 = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
    return g, q1, q2&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    g, q1, q2 = citeste_datele(&amp;quot;skipassIN.txt&amp;quot;)&lt;br /&gt;
    n1 = len(q1)&lt;br /&gt;
    n2 = len(q2)&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(g, n1, n2):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Initialize dp array with a large number&lt;br /&gt;
    dp = [[float(&#039;inf&#039;)] * (n2 + 1) for _ in range(n1 + 1)]&lt;br /&gt;
    dp[0][0] = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(n1 + 1):&lt;br /&gt;
        for j in range(n2 + 1):&lt;br /&gt;
            if i &amp;gt; 0:&lt;br /&gt;
                dp[i][j] = min(dp[i][j], dp[i - 1][j] + 1)&lt;br /&gt;
            if j &amp;gt; 0:&lt;br /&gt;
                dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1)&lt;br /&gt;
            if i &amp;gt; 0 and j &amp;gt; 0:&lt;br /&gt;
                dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1)&lt;br /&gt;
            if i &amp;gt; 1 and q1[i - 1] == q1[i - 2]:&lt;br /&gt;
                dp[i][j] = min(dp[i][j], dp[i - 2][j] + 1)&lt;br /&gt;
            if j &amp;gt; 1 and q2[j - 1] == q2[j - 2]:&lt;br /&gt;
                dp[i][j] = min(dp[i][j], dp[i][j - 2] + 1)&lt;br /&gt;
            if i &amp;gt; 0 and j &amp;gt; 0 and q1[i - 1] == q2[j - 1]:&lt;br /&gt;
                dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;skipassOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(dp[n1][n2]))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2163_-_Episodul_3&amp;diff=9792</id>
		<title>2163 - Episodul 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2163_-_Episodul_3&amp;diff=9792"/>
		<updated>2024-05-18T13:17:15Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Enunț =&lt;br /&gt;
Zoli joacă cu un labirint de dimensiune &amp;lt;code&amp;gt;N x N&amp;lt;/code&amp;gt;, format din camere de dimensiune &amp;lt;code&amp;gt;1 x 1&amp;lt;/code&amp;gt;, inițial toate inaccesibile. Auzind că Zoli este mare informatician, Dănutz și D’Umbră au decis să îl pună la încercare, după cum urmează:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 x y&amp;lt;/code&amp;gt;: Dănutz transformă camera inaccesibilă &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt; într-una accesibilă.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 x1 y1 x2 y2&amp;lt;/code&amp;gt;: D’Umbră îl întreabă pe Zoli care este numărul minim de camere ce trebuie traversate pentru a ajunge din camera accesibilă &amp;lt;code&amp;gt;(x1, y1)&amp;lt;/code&amp;gt; în camera accesibilă &amp;lt;code&amp;gt;(x2, y2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Zoli a rezolvat deja această problemă, fiind una banală. El s-a dus să se joace LOL și este curios dacă o poți rezolva și tu. Pentru &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; evenimente de forma celor de mai sus, să se scrie un program care le procesează și afișează în fișierul de ieșire rezultatele operațiilor de tip &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, în ordinea în care acestea apar în fișierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;episodul3IN.txt&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;, iar pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; operații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;episodul3OUT.txt&amp;lt;/code&amp;gt; va conține pe fiecare linie rezultatele operațiilor de tipul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, în ordinea în care acestea apar în fișierul de intrare. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 250.000&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 operațiile de tipul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;: camera &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt; va avea exact o cameră vecină pe linie sau coloană deja accesibilă la momentul transformării sale, excepție făcând camera care este transformată prima.&lt;br /&gt;
* InParser&lt;br /&gt;
* OutParser&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;episodul3IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 7&lt;br /&gt;
 1 1 1&lt;br /&gt;
 1 1 2&lt;br /&gt;
 2 1 1 1 2&lt;br /&gt;
 1 2 2&lt;br /&gt;
 1 1 3&lt;br /&gt;
 2 1 3 2 2&lt;br /&gt;
 2 1 1 2 2&lt;br /&gt;
&amp;lt;code&amp;gt;episodul3OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;episodul3IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001 7&lt;br /&gt;
 1 1 1&lt;br /&gt;
 1 1 2&lt;br /&gt;
 2 1 1 1 2&lt;br /&gt;
 1 2 2&lt;br /&gt;
 1 1 3&lt;br /&gt;
 2 1 3 2 2&lt;br /&gt;
 2 1 1 2 2&lt;br /&gt;
&amp;lt;code&amp;gt;episodul3OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class InParser:&lt;br /&gt;
    def __init__(self, filename):&lt;br /&gt;
        self.fin = open(filename, &amp;quot;r&amp;quot;)&lt;br /&gt;
        self.buff = self.fin.read()&lt;br /&gt;
        self.sp = -1&lt;br /&gt;
        self.length = len(self.buff)&lt;br /&gt;
&lt;br /&gt;
    def read_ch(self):&lt;br /&gt;
        self.sp += 1&lt;br /&gt;
        if self.sp &amp;lt; self.length:&lt;br /&gt;
            return self.buff[self.sp]&lt;br /&gt;
        return &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def __lshift__(self, n):&lt;br /&gt;
        c = self.read_ch()&lt;br /&gt;
        while c and not c.isdigit() and c != &#039;-&#039;:&lt;br /&gt;
            c = self.read_ch()&lt;br /&gt;
        if not c:&lt;br /&gt;
            return self&lt;br /&gt;
        sgn = 1&lt;br /&gt;
        if c == &#039;-&#039;:&lt;br /&gt;
            n[0] = 0&lt;br /&gt;
            sgn = -1&lt;br /&gt;
        else:&lt;br /&gt;
            n[0] = int(c)&lt;br /&gt;
        c = self.read_ch()&lt;br /&gt;
        while c.isdigit():&lt;br /&gt;
            n[0] = 10 * n[0] + int(c)&lt;br /&gt;
            c = self.read_ch()&lt;br /&gt;
        n[0] *= sgn&lt;br /&gt;
        return self&lt;br /&gt;
&lt;br /&gt;
class OutParser:&lt;br /&gt;
    def __init__(self, filename):&lt;br /&gt;
        self.fout = open(filename, &amp;quot;w&amp;quot;)&lt;br /&gt;
        self.buff = []&lt;br /&gt;
        self.sp = 0&lt;br /&gt;
&lt;br /&gt;
    def __del__(self):&lt;br /&gt;
        self.fout.write(&amp;quot;&amp;quot;.join(self.buff))&lt;br /&gt;
        self.fout.close()&lt;br /&gt;
&lt;br /&gt;
    def __lshift__(self, vu32):&lt;br /&gt;
        if isinstance(vu32, int):&lt;br /&gt;
            self.buff.append(str(vu32))&lt;br /&gt;
        elif isinstance(vu32, str):&lt;br /&gt;
            self.buff.append(vu32)&lt;br /&gt;
        return self&lt;br /&gt;
&lt;br /&gt;
dx = [1, -1, 0, 0]&lt;br /&gt;
dy = [0, 0, 1, -1]&lt;br /&gt;
Nmax = 1005&lt;br /&gt;
getNode = [[0] * Nmax for _ in range(Nmax)]&lt;br /&gt;
T = [[0] * (Nmax * Nmax) for _ in range(22)]&lt;br /&gt;
nodes = 0&lt;br /&gt;
dist = [0] * (Nmax * Nmax)&lt;br /&gt;
&lt;br /&gt;
def getKthAncestor(K, node):&lt;br /&gt;
    for i in range(10, -1, -1):&lt;br /&gt;
        if K &amp;amp; (1 &amp;lt;&amp;lt; i):&lt;br /&gt;
            node = T[i][node]&lt;br /&gt;
            K -= (1 &amp;lt;&amp;lt; i)&lt;br /&gt;
    return node&lt;br /&gt;
&lt;br /&gt;
def getLCA(node1, node2):&lt;br /&gt;
    if node1 == node2:&lt;br /&gt;
        return node1&lt;br /&gt;
    pos = dist[node1] + 1&lt;br /&gt;
    i = 0&lt;br /&gt;
    while (1 &amp;lt;&amp;lt; i) &amp;lt;= dist[node1]:&lt;br /&gt;
        i += 1&lt;br /&gt;
    for i in range(i, -1, -1):&lt;br /&gt;
        if T[i][node1] != T[i][node2]:&lt;br /&gt;
            node1 = T[i][node1]&lt;br /&gt;
            node2 = T[i][node2]&lt;br /&gt;
            pos -= (1 &amp;lt;&amp;lt; i)&lt;br /&gt;
    return T[0][node1]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    fin = InParser(&amp;quot;episodul3IN.txt&amp;quot;)&lt;br /&gt;
    fout = OutParser(&amp;quot;episodul3OUT.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    N = [0]&lt;br /&gt;
    M = [0]&lt;br /&gt;
    fin &amp;lt;&amp;lt; N &amp;lt;&amp;lt; M&lt;br /&gt;
    N = N[0]&lt;br /&gt;
    M = M[0]&lt;br /&gt;
&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 1000) or not (1 &amp;lt;= M &amp;lt;= 250000):&lt;br /&gt;
        fout &amp;lt;&amp;lt; &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    global nodes&lt;br /&gt;
    for _ in range(M):&lt;br /&gt;
        t = [0]&lt;br /&gt;
        fin &amp;lt;&amp;lt; t&lt;br /&gt;
        t = t[0]&lt;br /&gt;
        if t == 1:&lt;br /&gt;
            i = [0]&lt;br /&gt;
            j = [0]&lt;br /&gt;
            fin &amp;lt;&amp;lt; i &amp;lt;&amp;lt; j&lt;br /&gt;
            i = i[0]&lt;br /&gt;
            j = j[0]&lt;br /&gt;
            if not (1 &amp;lt;= i &amp;lt;= N and 1 &amp;lt;= j &amp;lt;= N):&lt;br /&gt;
                fout &amp;lt;&amp;lt; &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
                return&lt;br /&gt;
            nodes += 1&lt;br /&gt;
            getNode[i][j] = nodes&lt;br /&gt;
            for d in range(4):&lt;br /&gt;
                ni = i + dx[d]&lt;br /&gt;
                nj = j + dy[d]&lt;br /&gt;
                if getNode[ni][nj] != 0:&lt;br /&gt;
                    T[0][nodes] = getNode[ni][nj]&lt;br /&gt;
                    dist[nodes] = 1 + dist[getNode[ni][nj]]&lt;br /&gt;
            if dist[nodes] == 0:&lt;br /&gt;
                dist[nodes] = 1&lt;br /&gt;
            for i in range(1, 22):&lt;br /&gt;
                if (1 &amp;lt;&amp;lt; i) &amp;lt;= dist[nodes]:&lt;br /&gt;
                    T[i][nodes] = T[i - 1][T[i - 1][nodes]]&lt;br /&gt;
        elif t == 2:&lt;br /&gt;
            i = [0]&lt;br /&gt;
            j = [0]&lt;br /&gt;
            i2 = [0]&lt;br /&gt;
            j2 = [0]&lt;br /&gt;
            fin &amp;lt;&amp;lt; i &amp;lt;&amp;lt; j &amp;lt;&amp;lt; i2 &amp;lt;&amp;lt; j2&lt;br /&gt;
            i = i[0]&lt;br /&gt;
            j = j[0]&lt;br /&gt;
            i2 = i2[0]&lt;br /&gt;
            j2 = j2[0]&lt;br /&gt;
            if not (1 &amp;lt;= i &amp;lt;= N and 1 &amp;lt;= j &amp;lt;= N and 1 &amp;lt;= i2 &amp;lt;= N and 1 &amp;lt;= j2 &amp;lt;= N):&lt;br /&gt;
                fout &amp;lt;&amp;lt; &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
                return&lt;br /&gt;
            node1 = getNode[i][j]&lt;br /&gt;
            node2 = getNode[i2][j2]&lt;br /&gt;
            if dist[node1] &amp;gt; dist[node2]:&lt;br /&gt;
                node1, node2 = node2, node1&lt;br /&gt;
            sameLevel = getKthAncestor(dist[node2] - dist[node1], node2)&lt;br /&gt;
            LCA = getLCA(node1, sameLevel)&lt;br /&gt;
            fout &amp;lt;&amp;lt; dist[node1] + dist[node2] - 2 * dist[LCA] + 1 &amp;lt;&amp;lt; &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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2163_-_Episodul_3&amp;diff=9791</id>
		<title>2163 - Episodul 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2163_-_Episodul_3&amp;diff=9791"/>
		<updated>2024-05-18T13:16:36Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Enunț =&lt;br /&gt;
Zoli joacă cu un labirint de dimensiune &amp;lt;code&amp;gt;N x N&amp;lt;/code&amp;gt;, format din camere de dimensiune &amp;lt;code&amp;gt;1 x 1&amp;lt;/code&amp;gt;, inițial toate inaccesibile. Auzind că Zoli este mare informatician, Dănutz și D’Umbră au decis să îl pună la încercare, după cum urmează:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 x y&amp;lt;/code&amp;gt;: Dănutz transformă camera inaccesibilă &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt; într-una accesibilă.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 x1 y1 x2 y2&amp;lt;/code&amp;gt;: D’Umbră îl întreabă pe Zoli care este numărul minim de camere ce trebuie traversate pentru a ajunge din camera accesibilă &amp;lt;code&amp;gt;(x1, y1)&amp;lt;/code&amp;gt; în camera accesibilă &amp;lt;code&amp;gt;(x2, y2)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Zoli a rezolvat deja această problemă, fiind una banală. El s-a dus să se joace LOL și este curios dacă o poți rezolva și tu. Pentru &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; evenimente de forma celor de mai sus, să se scrie un program care le procesează și afișează în fișierul de ieșire rezultatele operațiilor de tip &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, în ordinea în care acestea apar în fișierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;episodul3IN.txt&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;, iar pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; operații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;episodul3OUT.txt&amp;lt;/code&amp;gt; va conține pe fiecare linie rezultatele operațiilor de tipul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, în ordinea în care acestea apar în fișierul de intrare. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 250.000&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 operațiile de tipul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;: camera &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt; va avea exact o cameră vecină pe linie sau coloană deja accesibilă la momentul transformării sale, excepție făcând camera care este transformată prima.&lt;br /&gt;
* InParser&lt;br /&gt;
* OutParser&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;episodul3IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 7&lt;br /&gt;
 1 1 1&lt;br /&gt;
 1 1 2&lt;br /&gt;
 2 1 1 1 2&lt;br /&gt;
 1 2 2&lt;br /&gt;
 1 1 3&lt;br /&gt;
 2 1 3 2 2&lt;br /&gt;
 2 1 1 2 2&lt;br /&gt;
&amp;lt;code&amp;gt;episodul3OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;episodul3IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001 7&lt;br /&gt;
 1 1 1&lt;br /&gt;
 1 1 2&lt;br /&gt;
 2 1 1 1 2&lt;br /&gt;
 1 2 2&lt;br /&gt;
 1 1 3&lt;br /&gt;
 2 1 3 2 2&lt;br /&gt;
 2 1 1 2 2&lt;br /&gt;
&amp;lt;code&amp;gt;episodul3OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class InParser:&lt;br /&gt;
    def __init__(self, filename):&lt;br /&gt;
        self.fin = open(filename, &amp;quot;r&amp;quot;)&lt;br /&gt;
        self.buff = self.fin.read()&lt;br /&gt;
        self.sp = -1&lt;br /&gt;
        self.length = len(self.buff)&lt;br /&gt;
&lt;br /&gt;
    def read_ch(self):&lt;br /&gt;
        self.sp += 1&lt;br /&gt;
        if self.sp &amp;lt; self.length:&lt;br /&gt;
            return self.buff[self.sp]&lt;br /&gt;
        return &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def __lshift__(self, n):&lt;br /&gt;
        c = self.read_ch()&lt;br /&gt;
        while c and not c.isdigit() and c != &#039;-&#039;:&lt;br /&gt;
            c = self.read_ch()&lt;br /&gt;
        if not c:&lt;br /&gt;
            return self&lt;br /&gt;
        sgn = 1&lt;br /&gt;
        if c == &#039;-&#039;:&lt;br /&gt;
            n[0] = 0&lt;br /&gt;
            sgn = -1&lt;br /&gt;
        else:&lt;br /&gt;
            n[0] = int(c)&lt;br /&gt;
        c = self.read_ch()&lt;br /&gt;
        while c.isdigit():&lt;br /&gt;
            n[0] = 10 * n[0] + int(c)&lt;br /&gt;
            c = self.read_ch()&lt;br /&gt;
        n[0] *= sgn&lt;br /&gt;
        return self&lt;br /&gt;
&lt;br /&gt;
class OutParser:&lt;br /&gt;
    def __init__(self, filename):&lt;br /&gt;
        self.fout = open(filename, &amp;quot;w&amp;quot;)&lt;br /&gt;
        self.buff = []&lt;br /&gt;
        self.sp = 0&lt;br /&gt;
&lt;br /&gt;
    def __del__(self):&lt;br /&gt;
        self.fout.write(&amp;quot;&amp;quot;.join(self.buff))&lt;br /&gt;
        self.fout.close()&lt;br /&gt;
&lt;br /&gt;
    def __lshift__(self, vu32):&lt;br /&gt;
        if isinstance(vu32, int):&lt;br /&gt;
            self.buff.append(str(vu32))&lt;br /&gt;
        elif isinstance(vu32, str):&lt;br /&gt;
            self.buff.append(vu32)&lt;br /&gt;
        return self&lt;br /&gt;
&lt;br /&gt;
dx = [1, -1, 0, 0]&lt;br /&gt;
dy = [0, 0, 1, -1]&lt;br /&gt;
Nmax = 1005&lt;br /&gt;
getNode = [[0] * Nmax for _ in range(Nmax)]&lt;br /&gt;
T = [[0] * (Nmax * Nmax) for _ in range(22)]&lt;br /&gt;
nodes = 0&lt;br /&gt;
dist = [0] * (Nmax * Nmax)&lt;br /&gt;
&lt;br /&gt;
def getKthAncestor(K, node):&lt;br /&gt;
    for i in range(10, -1, -1):&lt;br /&gt;
        if K &amp;amp; (1 &amp;lt;&amp;lt; i):&lt;br /&gt;
            node = T[i][node]&lt;br /&gt;
            K -= (1 &amp;lt;&amp;lt; i)&lt;br /&gt;
    return node&lt;br /&gt;
&lt;br /&gt;
def getLCA(node1, node2):&lt;br /&gt;
    if node1 == node2:&lt;br /&gt;
        return node1&lt;br /&gt;
    pos = dist[node1] + 1&lt;br /&gt;
    i = 0&lt;br /&gt;
    while (1 &amp;lt;&amp;lt; i) &amp;lt;= dist[node1]:&lt;br /&gt;
        i += 1&lt;br /&gt;
    for i in range(i, -1, -1):&lt;br /&gt;
        if T[i][node1] != T[i][node2]:&lt;br /&gt;
            node1 = T[i][node1]&lt;br /&gt;
            node2 = T[i][node2]&lt;br /&gt;
            pos -= (1 &amp;lt;&amp;lt; i)&lt;br /&gt;
    return T[0][node1]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    fin = InParser(&amp;quot;episodul3IN.txt&amp;quot;)&lt;br /&gt;
    fout = OutParser(&amp;quot;episodul3OUT.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    N = [0]&lt;br /&gt;
    M = [0]&lt;br /&gt;
    fin &amp;lt;&amp;lt; N &amp;lt;&amp;lt; M&lt;br /&gt;
    N = N[0]&lt;br /&gt;
    M = M[0]&lt;br /&gt;
&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 1000) or not (1 &amp;lt;= M &amp;lt;= 250000):&lt;br /&gt;
        fout &amp;lt;&amp;lt; &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    global nodes&lt;br /&gt;
    for _ in range(M):&lt;br /&gt;
        t = [0]&lt;br /&gt;
        fin &amp;lt;&amp;lt; t&lt;br /&gt;
        t = t[0]&lt;br /&gt;
        if t == 1:&lt;br /&gt;
            i = [0]&lt;br /&gt;
            j = [0]&lt;br /&gt;
            fin &amp;lt;&amp;lt; i &amp;lt;&amp;lt; j&lt;br /&gt;
            i = i[0]&lt;br /&gt;
            j = j[0]&lt;br /&gt;
            if not (1 &amp;lt;= i &amp;lt;= N and 1 &amp;lt;= j &amp;lt;= N):&lt;br /&gt;
                fout &amp;lt;&amp;lt; &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
                return&lt;br /&gt;
            nodes += 1&lt;br /&gt;
            getNode[i][j] = nodes&lt;br /&gt;
            for d in range(4):&lt;br /&gt;
                ni = i + dx[d]&lt;br /&gt;
                nj = j + dy[d]&lt;br /&gt;
                if getNode[ni][nj] != 0:&lt;br /&gt;
                    T[0][nodes] = getNode[ni][nj]&lt;br /&gt;
                    dist[nodes] = 1 + dist[getNode[ni][nj]]&lt;br /&gt;
            if dist[nodes] == 0:&lt;br /&gt;
                dist[nodes] = 1&lt;br /&gt;
            for i in range(1, 22):&lt;br /&gt;
                if (1 &amp;lt;&amp;lt; i) &amp;lt;= dist[nodes]:&lt;br /&gt;
                    T[i][nodes] = T[i - 1][T[i - 1][nodes]]&lt;br /&gt;
        elif t == 2:&lt;br /&gt;
            i = [0]&lt;br /&gt;
            j = [0]&lt;br /&gt;
            i2 = [0]&lt;br /&gt;
            j2 = [0]&lt;br /&gt;
            fin &amp;lt;&amp;lt; i &amp;lt;&amp;lt; j &amp;lt;&amp;lt; i2 &amp;lt;&amp;lt; j2&lt;br /&gt;
            i = i[0]&lt;br /&gt;
            j = j[0]&lt;br /&gt;
            i2 = i2[0]&lt;br /&gt;
            j2 = j2[0]&lt;br /&gt;
            if not (1 &amp;lt;= i &amp;lt;= N and 1 &amp;lt;= j &amp;lt;= N and 1 &amp;lt;= i2 &amp;lt;= N and 1 &amp;lt;= j2 &amp;lt;= N):&lt;br /&gt;
                fout &amp;lt;&amp;lt; &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
                return&lt;br /&gt;
            node1 = getNode[i][j]&lt;br /&gt;
            node2 = getNode[i2][j2]&lt;br /&gt;
            if dist[node1] &amp;gt; dist[node2]:&lt;br /&gt;
                node1, node2 = node2, node1&lt;br /&gt;
            sameLevel = getKthAncestor(dist[node2] - dist[node1], node2)&lt;br /&gt;
            LCA = getLCA(node1, sameLevel)&lt;br /&gt;
            fout &amp;lt;&amp;lt; dist[node1] + dist[node2] - 2 * dist[LCA] + 1 &amp;lt;&amp;lt; &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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2493_-_Recc&amp;diff=9790</id>
		<title>2493 - Recc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2493_-_Recc&amp;diff=9790"/>
		<updated>2024-05-18T13:11:14Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Enunț =&lt;br /&gt;
Ana Mia are o recurență liniară de forma &amp;lt;code&amp;gt;P[N] = A[1]*P[N-1] + A[2]*P[N-2] + A[3]*P[N-3] + A[4]*P[N-4]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;N ≥ 5&amp;lt;/code&amp;gt;. Studiind-o, îi vine o idee MAXIMĂ de problemă: “Pentru câte cvadriplete &amp;lt;code&amp;gt;(P[1], P[2], P[3], P[4])&amp;lt;/code&amp;gt; din mulțimea numerelor naturale &amp;lt;code&amp;gt;[1, B]&amp;lt;/code&amp;gt; valoarea &amp;lt;code&amp;gt;P[N]&amp;lt;/code&amp;gt; modulo &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; are valoarea &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;?”&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care citind &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, și numerele &amp;lt;code&amp;gt;A[i], 1 ≤ i ≤ 4&amp;lt;/code&amp;gt; rezolvă problema Anei.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;reccIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, separate printr-un spațiu, iar pe a doua linie &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; numere naturale separate prin spații, reprezentând numerele &amp;lt;code&amp;gt;A[i], 1 ≤ i ≤ 4&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;reccOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;ANS&amp;lt;/code&amp;gt;, răspunsul problemei puse de Ana Mia. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;5 ≤ N ≤ 10^18&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ B ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ K ≤ 10^9&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ X &amp;lt; K&amp;lt;/code&amp;gt;&lt;br /&gt;
* numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât &amp;lt;code&amp;gt;1.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;reccIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 2 3 4&lt;br /&gt;
 1 2 3 1&lt;br /&gt;
&amp;lt;code&amp;gt;reccOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Soluțiile sunt &amp;lt;code&amp;gt;(2, 1, 2, 1)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(2, 2, 2, 1)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;reccIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 2 5 4&lt;br /&gt;
 1 2 3 1&lt;br /&gt;
&amp;lt;code&amp;gt;reccOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class Matrice:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.M = [[0] * 4 for _ in range(4)]&lt;br /&gt;
&lt;br /&gt;
def inmultire(A, B, K):&lt;br /&gt;
    C = Matrice()&lt;br /&gt;
    for i in range(4):&lt;br /&gt;
        for j in range(4):&lt;br /&gt;
            for k in range(4):&lt;br /&gt;
                C.M[i][j] = (C.M[i][j] + A.M[i][k] * B.M[k][j]) % K&lt;br /&gt;
    return C&lt;br /&gt;
&lt;br /&gt;
def putere(A, N, K):&lt;br /&gt;
    if N == 1:&lt;br /&gt;
        return A&lt;br /&gt;
    if N % 2 == 1:&lt;br /&gt;
        return inmultire(A, putere(A, N - 1, K), K)&lt;br /&gt;
    P = putere(A, N // 2, K)&lt;br /&gt;
    return inmultire(P, P, K)&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(N, B, K, X):&lt;br /&gt;
    if not (5 &amp;lt;= N &amp;lt;= 10**18):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= B &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= K &amp;lt;= 10**9):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt;= X &amp;lt; K):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def F(val, vs, vd, I):&lt;br /&gt;
    st, dr = 1, I&lt;br /&gt;
    while st &amp;lt;= dr:&lt;br /&gt;
        mij = (st + dr) // 2&lt;br /&gt;
        if vs[mij] == val:&lt;br /&gt;
            return vd[mij]&lt;br /&gt;
        if vs[mij] &amp;lt; val:&lt;br /&gt;
            st = mij + 1&lt;br /&gt;
        else:&lt;br /&gt;
            dr = mij - 1&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;reccIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        # Citim prima linie și împărțim valorile&lt;br /&gt;
        linia1 = f.readline().strip().split()&lt;br /&gt;
        N = int(linia1[0])&lt;br /&gt;
        B = int(linia1[1])&lt;br /&gt;
        X = int(linia1[2])&lt;br /&gt;
        K = int(linia1[3])&lt;br /&gt;
        &lt;br /&gt;
        if not verificare_restrictii(N, B, K, X):&lt;br /&gt;
            with open(&amp;quot;reccOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        # Citim a doua linie și împărțim valorile&lt;br /&gt;
        linia2 = f.readline().strip().split()&lt;br /&gt;
        A = [int(val) for val in linia2]&lt;br /&gt;
        &lt;br /&gt;
    C = Matrice()&lt;br /&gt;
    for i in range(4):&lt;br /&gt;
        C.M[3 - i][3] = A[i] % K&lt;br /&gt;
    &lt;br /&gt;
    for i in range(3):&lt;br /&gt;
        C.M[i + 1][i] = 1&lt;br /&gt;
    &lt;br /&gt;
    C = putere(C, N - 4, K)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(4):&lt;br /&gt;
        A[i] = C.M[i][3]&lt;br /&gt;
    &lt;br /&gt;
    vs = []&lt;br /&gt;
    vd = []&lt;br /&gt;
    I = 0&lt;br /&gt;
    for i in range(1, B + 1):&lt;br /&gt;
        for j in range(1, B + 1):&lt;br /&gt;
            vs.append((A[0] * i % K + A[1] * j % K) % K)&lt;br /&gt;
            I += 1&lt;br /&gt;
    &lt;br /&gt;
    vs.sort()&lt;br /&gt;
    &lt;br /&gt;
    vd = [0] * (I + 1)&lt;br /&gt;
    vd[0] = 1&lt;br /&gt;
    II = 1&lt;br /&gt;
    for i in range(1, I):&lt;br /&gt;
        if vs[II - 1] != vs[i]:&lt;br /&gt;
            vs[II] = vs[i]&lt;br /&gt;
            vd[II] = 1&lt;br /&gt;
            II += 1&lt;br /&gt;
        else:&lt;br /&gt;
            vd[II - 1] += 1&lt;br /&gt;
    I = II&lt;br /&gt;
    &lt;br /&gt;
    sol = 0&lt;br /&gt;
    for i in range(1, B + 1):&lt;br /&gt;
        for j in range(1, B + 1):&lt;br /&gt;
            v = (A[2] * i % K + A[3] * j % K) % K&lt;br /&gt;
            v = (X - v + K) % K&lt;br /&gt;
            sol += F(v, vs, vd, I)&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;reccOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        g.write(f&amp;quot;{sol}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2018_-_Rogvaiv&amp;diff=9789</id>
		<title>2018 - Rogvaiv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2018_-_Rogvaiv&amp;diff=9789"/>
		<updated>2024-05-18T13:04:29Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Vecinul meu, Dorel, tocmai s-a mutat la casă şi vrea să-şi vopsească gardul. Fiind îndrăgostit de frumos, a cumpărat 7 cutii de vopsea: roşu, orange, galben, verde, albastru, indigo şi violet. Acum însă, are o dilemă: în câte moduri poate vopsi cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; uluci ale gardului, ştiind că fiecare ulucă poate fi vopsită cu oricare dintre culorile cumpărate?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;rogvaivIN.txt&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;rogvaivOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul de moduri în care Dorel poate vopsi gardul, 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;
* numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; are cel mult &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt; de cifre. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;rogvaivIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&amp;lt;code&amp;gt;rogvaivOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 343&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Fiecare ulucă poate fi vopsită cu una din cele &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; culori, deci avem &amp;lt;code&amp;gt;7•7•7=343&amp;lt;/code&amp;gt; moduri.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(a):&lt;br /&gt;
    if len(a) &amp;gt; 1000001:&lt;br /&gt;
        return False&lt;br /&gt;
    if not a.isdigit():&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;rogvaivIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
            a = f.read().strip()&lt;br /&gt;
    except FileNotFoundError:&lt;br /&gt;
        with open(&amp;quot;rogvaivOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
            g.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(a):&lt;br /&gt;
        with open(&amp;quot;rogvaivOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
            g.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    n = len(a)&lt;br /&gt;
    s = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        s = (s * 10 + int(a[i])) % 1000000006&lt;br /&gt;
&lt;br /&gt;
    c = [0] * 50&lt;br /&gt;
    i = 0&lt;br /&gt;
    while s != 0:&lt;br /&gt;
        i += 1&lt;br /&gt;
        c[i] = s % 2&lt;br /&gt;
        s = s // 2&lt;br /&gt;
&lt;br /&gt;
    p = 1&lt;br /&gt;
    for j in range(i, 0, -1):&lt;br /&gt;
        if c[j] == 1:&lt;br /&gt;
            p = ((p * p) * 7) % 1000000007&lt;br /&gt;
        else:&lt;br /&gt;
            p = (p * p) % 1000000007&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;rogvaivOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        g.write(str(p))&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2043_-_Subsecventa&amp;diff=9788</id>
		<title>2043 - Subsecventa</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2043_-_Subsecventa&amp;diff=9788"/>
		<updated>2024-05-18T12:50:58Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
O echipă de cercetători de la Agenţia Spaţială Europeană au recepţionat un mesaj provenit dintr-o&lt;br /&gt;
&lt;br /&gt;
altă galaxie. În urma analizelor complexe efectuate asupra mesajului recepţionat, ei au descoperit că&lt;br /&gt;
&lt;br /&gt;
mesajul conţine mai multe subsecvenţe neîntrerupte de caractere care sunt palindroame. Se ştie că o&lt;br /&gt;
&lt;br /&gt;
secvenţă de caractere este un &#039;&#039;palindrom&#039;&#039; dacă prin citirea ei de la stânga la dreapta şi de la dreapta la&lt;br /&gt;
&lt;br /&gt;
stânga se obţin aceleaşi caractere. Mesajul recepţionat este codificat doar cu literele mari A, B, …, Z&lt;br /&gt;
&lt;br /&gt;
ale alfabetului englez şi nu conţine alte caractere.&lt;br /&gt;
&lt;br /&gt;
Pentru analiza mesajului recepţionat cercetătorii au nevoie de un program care să determine subsecvenţa palindrom de lungime maximă. În cazul în care există mai multe subsecvenţe&lt;br /&gt;
&lt;br /&gt;
care au aceeaşi lungime maximă, se va reţine subsecvenţa care apare prima dată&lt;br /&gt;
&lt;br /&gt;
în scrierea mesajului, citit de la stânga spre dreapta.&lt;br /&gt;
&lt;br /&gt;
De exemplu, pentru mesajul “CABABAD”, subsecvenţa palindrom cu lungimea maximă este “ABABA” şi are lungimea 5.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
În fișierul de intrare &amp;lt;code&amp;gt;subsecventaIN.txt&amp;lt;/code&amp;gt; este scris şirul de caractere ale mesajului. Mesajul este format&lt;br /&gt;
&lt;br /&gt;
doar din litere mari ale alfabetului englez şi are cel mult 100.000 de caractere.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subsecventaOUt.txt&amp;lt;/code&amp;gt; va conține pe prima linie un număr natural reprezentând lungimea&lt;br /&gt;
&lt;br /&gt;
maximă a unei subsecvenţe palindrom, iar pe a doua linie se va scrie subsecvenţa&lt;br /&gt;
&lt;br /&gt;
palindrom de lungime maximă care apare prima dată în mesaj. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* Mesajul conţine doar litere mari şi are cel mult &amp;lt;code&amp;gt;100.000&amp;lt;/code&amp;gt; de caractere.&lt;br /&gt;
* Pentru 60% din teste numărul de caractere din fişierul de intrare este cel mult &amp;lt;code&amp;gt;1.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subsecventaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 CABABAD&lt;br /&gt;
&amp;lt;code&amp;gt;subsecventaOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
 ABABA&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Cea mai lungă subsecvenţă palindrom are lungimea 5.&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;subsecventaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 CABABADa&lt;br /&gt;
&amp;lt;code&amp;gt;subsecventaOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citire(file_in):&lt;br /&gt;
    with open(file_in, &#039;r&#039;) as fin:&lt;br /&gt;
        s = fin.read().strip()&lt;br /&gt;
    return s&lt;br /&gt;
&lt;br /&gt;
def init(s):&lt;br /&gt;
    n = len(s)&lt;br /&gt;
    t = [&#039;^&#039;]&lt;br /&gt;
    for char in s:&lt;br /&gt;
        t.append(&#039;#&#039;)&lt;br /&gt;
        t.append(char)&lt;br /&gt;
    t.append(&#039;#&#039;)&lt;br /&gt;
    t.append(&#039;\0&#039;)&lt;br /&gt;
    return &#039;&#039;.join(t)&lt;br /&gt;
&lt;br /&gt;
def manacher(t):&lt;br /&gt;
    n = len(t)&lt;br /&gt;
    P = [0] * n&lt;br /&gt;
    C = R = 0&lt;br /&gt;
    maxpal = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n - 1):&lt;br /&gt;
        j = 2 * C - i&lt;br /&gt;
        if R &amp;gt; i:&lt;br /&gt;
            P[i] = min(R - i, P[j])&lt;br /&gt;
&lt;br /&gt;
        while t[i + 1 + P[i]] == t[i - 1 - P[i]]:&lt;br /&gt;
            P[i] += 1&lt;br /&gt;
&lt;br /&gt;
        if i + P[i] &amp;gt; R:&lt;br /&gt;
            C = i&lt;br /&gt;
            R = i + P[i]&lt;br /&gt;
&lt;br /&gt;
        if P[i] &amp;gt; P[maxpal]:&lt;br /&gt;
            maxpal = i&lt;br /&gt;
&lt;br /&gt;
    rez = P[maxpal]&lt;br /&gt;
    ind = (maxpal - 1 - rez) // 2&lt;br /&gt;
    return rez, ind&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(s):&lt;br /&gt;
    if not s.isalpha() or not s.isupper() or len(s) &amp;gt; 100000:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    file_in = &amp;quot;subsecventaIN.txt&amp;quot;&lt;br /&gt;
    file_out = &amp;quot;subsecventaOUT.txt&amp;quot;&lt;br /&gt;
    s = citire(file_in)&lt;br /&gt;
    &lt;br /&gt;
    if not verifica_restrictii(s):&lt;br /&gt;
        with open(file_out, &#039;w&#039;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    t = init(s)&lt;br /&gt;
    rez, ind = manacher(t)&lt;br /&gt;
    &lt;br /&gt;
    with open(file_out, &#039;w&#039;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{rez}\n&amp;quot;)&lt;br /&gt;
        fout.write(f&amp;quot;{s[ind:ind + rez]}&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;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
Cea mai lungă subsecvenţă palindrom are lungimea 5.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Există o singură subsecvenţă palindrom de lungime 5 în mesaj: ABABA.&lt;/div&gt;</summary>
		<author><name>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1760_-_Optim&amp;diff=9787</id>
		<title>1760 - Optim</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1760_-_Optim&amp;diff=9787"/>
		<updated>2024-05-18T12:31:52Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gigel primea de la mama lui, ca temă, o foaie pe care era scris un şir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi. Singurul calcul pe care ştia să îl facă până acum era suma tuturor numerelor. Pentru aceasta el plasa &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; semne de adunare, +, între numerele aflate pe poziţii consecutive în şir şi calcula astfel suma acestor numere. Între timp a crescut şi a învăţat şi operaţia de înmulţire pentru care foloseşte semnul *. Din şirul celor &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; semne de adunare, îi trece prin minte să înlocuiască &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; semne + cu &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; semne *.&lt;br /&gt;
&lt;br /&gt;
Îşi dă seama că tema se complică, deoarece înmulţirile trebuie efectuate înaintea adunărilor, dar nu se dă bătut şi duce calculul până la capăt.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieţi un program care să determine valoarea minimă pe care o poate obţine şi valoarea maximă pe care o poate obţine după înlocuirea menţionată.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;optimIN.txt&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;K&amp;lt;/code&amp;gt;, separate printr-un spaţiu, reprezentând numărul de numere întregi din şir, respectiv numărul de operaţii de înmulţire ce vor fi efectuate. Pe cea de a doua linie se află &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere întregi separate prin câte un spaţiu, , reprezentând numerele din şir.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;optimOUT.txt&amp;lt;/code&amp;gt; va conţine pe o singură linie, separate printr-un spaţiu, în ordine crescătoare, cele două valori cerute. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N ≤ 30&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ K ≤ 9; K &amp;lt; N&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-8 ≤ xi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;≤ 8,  1 ≤ i ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;optimIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 3&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
 3&lt;br /&gt;
 -1&lt;br /&gt;
 7&lt;br /&gt;
 -4&lt;br /&gt;
&amp;lt;code&amp;gt;optimOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 -31 86&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;2 * 0 + 3 * (-1)  + 7 * (-4)  = -31&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2 + 0 + 3 * (-1)  * 7 * (-4)  = 86&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;optimIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 8&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
 3&lt;br /&gt;
 -1&lt;br /&gt;
 7&lt;br /&gt;
 -4&lt;br /&gt;
&amp;lt;code&amp;gt;optimOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(N, K, A):&lt;br /&gt;
    if not (2 &amp;lt;= N &amp;lt;= 30) or not (0 &amp;lt;= K &amp;lt;= 9) or not (K &amp;lt; N):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(-8 &amp;lt;= x &amp;lt;= 8 for x in A):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def back(lv, k, aux, suma, A, N):&lt;br /&gt;
    global maxim, minim&lt;br /&gt;
    if lv == N:&lt;br /&gt;
        suma += aux&lt;br /&gt;
        if suma &amp;gt; maxim:&lt;br /&gt;
            maxim = suma&lt;br /&gt;
        if suma &amp;lt; minim:&lt;br /&gt;
            minim = suma&lt;br /&gt;
        return&lt;br /&gt;
    if N - lv &amp;gt; k:&lt;br /&gt;
        back(lv + 1, k, A[lv], suma + aux, A, N)&lt;br /&gt;
    if k &amp;gt; 0:&lt;br /&gt;
        back(lv + 1, k - 1, aux * A[lv], suma, A, N)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global maxim, minim&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;optimIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, K = map(int, fin.readline().strip().split())&lt;br /&gt;
        A = [int(fin.readline().strip()) for _ in range(N)]&lt;br /&gt;
    &lt;br /&gt;
    if not verificare_restrictii(N, K, A):&lt;br /&gt;
        with open(&amp;quot;optimOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    maxim = -2000000000&lt;br /&gt;
    minim = 2000000000&lt;br /&gt;
    &lt;br /&gt;
    back(1, K, A[0], 0, A, N)&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;optimOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{minim} {maxim}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3698_-_Bemo&amp;diff=9786</id>
		<title>3698 - Bemo</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3698_-_Bemo&amp;diff=9786"/>
		<updated>2024-05-18T10:19:32Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Se dă o matrice cu &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; coloane de numere distincte de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;R * C&amp;lt;/code&amp;gt;. Bemo, personajul emoţional, doreşte să urmărească cel mai bun drum din colţul superior stânga, de coordonate &amp;lt;code&amp;gt;(1, 1)&amp;lt;/code&amp;gt;, în colţul inferior dreapta, de coordonate &amp;lt;code&amp;gt;(R, C)&amp;lt;/code&amp;gt;. Un drum este o secvenţă de numere din matrice în care fiecare număr se găseşte în jos sau la dreapta numărului anterior, adică dacă &amp;lt;code&amp;gt;(i, j)&amp;lt;/code&amp;gt; este poziţia unui număr de pe un drum, atunci următorul număr poate fi cel de pe poziţia &amp;lt;code&amp;gt;(i + 1, j)&amp;lt;/code&amp;gt; sau cel de pe poziţia &amp;lt;code&amp;gt;(i, j + 1)&amp;lt;/code&amp;gt;. Pentru a determina dacă un drum &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; este mai bun decât un drum &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, numerele fiecărui drum se vor sorta şi se va alege cel mai mic lexicografic, de exemplu &amp;lt;code&amp;gt;[1,3,5,6,8] &amp;lt; [1,4,5,6,7]&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;bemoIN.txt&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; este numărul liniilor, iar &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; numărul coloanelor matricei lui Bemo. Pe următoarele &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; linii se vor găsi câte &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; numere separate printr-un spaţiu. Fiecare număr va fi unic şi va fi cuprins în intervalul &amp;lt;code&amp;gt;[1, R*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;bemoOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;R+C-1&amp;lt;/code&amp;gt; numere reprezentând cel mai bun drum pe care Bemo îl poate alege. Numerele vor fi scrise separate printr-un spațiu. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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; R, C &amp;lt; 1501&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Pentru 40% din teste: &amp;lt;code&amp;gt;0 &amp;lt; R&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C &amp;lt; 751&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Pentru 70% din teste: &amp;lt;code&amp;gt;0 &amp;lt; R, C &amp;lt; 1301&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Spunem că un drum &amp;lt;code&amp;gt;A =&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;a1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;a2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;aR+C-1&amp;lt;/code&amp;gt;) este mai mic lexicografic decât un drum &amp;lt;code&amp;gt;B =&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;b1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b2&amp;lt;/code&amp;gt;,…, &amp;lt;code&amp;gt;bR+C-1&amp;lt;/code&amp;gt;) dacă există o poziție &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; astfel încât &amp;lt;code&amp;gt;ap&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt; bp&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;a1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= b1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;a2&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= b2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;ap-1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= bp-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;bemoIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 4&lt;br /&gt;
 7 4 13 3&lt;br /&gt;
 8 11 12 2&lt;br /&gt;
 10 9 1 5&lt;br /&gt;
 16 14 15 6&lt;br /&gt;
&amp;lt;code&amp;gt;bemoOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 4 11 9 1 5 6&lt;br /&gt;
&lt;br /&gt;
= Exemplu 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;bemoIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 1502&lt;br /&gt;
 7 4 13 3&lt;br /&gt;
 8 11 12 2&lt;br /&gt;
 10 9 1 5&lt;br /&gt;
 16 14 15 6&lt;br /&gt;
&amp;lt;code&amp;gt;bemoOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
NMAX = 2011&lt;br /&gt;
&lt;br /&gt;
A = [[0] * NMAX for _ in range(NMAX)]&lt;br /&gt;
row = [0] * (NMAX * NMAX)&lt;br /&gt;
col = [0] * (NMAX * NMAX)&lt;br /&gt;
selected = [0] * (NMAX * NMAX)&lt;br /&gt;
elems = [0] * (2 * NMAX)&lt;br /&gt;
&lt;br /&gt;
R = C = nelems = 0&lt;br /&gt;
&lt;br /&gt;
def ReadInput():&lt;br /&gt;
    global R, C&lt;br /&gt;
    with open(&amp;quot;bemoIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        data = f.read().split()&lt;br /&gt;
    R, C = int(data[0]), int(data[1])&lt;br /&gt;
    &lt;br /&gt;
    # Verifică imediat după citirea dimensiunilor&lt;br /&gt;
    if not (0 &amp;lt; R &amp;lt; 1501 and 0 &amp;lt; C &amp;lt; 1501):&lt;br /&gt;
        with open(&amp;quot;bemoOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        sys.exit()&lt;br /&gt;
    &lt;br /&gt;
    index = 2&lt;br /&gt;
    for i in range(1, R + 1):&lt;br /&gt;
        for j in range(1, C + 1):&lt;br /&gt;
            A[i][j] = int(data[index])&lt;br /&gt;
            row[A[i][j]] = i&lt;br /&gt;
            col[A[i][j]] = j&lt;br /&gt;
            index += 1&lt;br /&gt;
&lt;br /&gt;
def Solve():&lt;br /&gt;
    global nelems&lt;br /&gt;
    selected[A[1][1]] = 1&lt;br /&gt;
    nelems = 1&lt;br /&gt;
    elems[1] = A[1][1]&lt;br /&gt;
    &lt;br /&gt;
    if R == 1 and C == 1:&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    selected[A[R][C]] = 1&lt;br /&gt;
    nelems += 1&lt;br /&gt;
    elems[nelems] = A[R][C]&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, R * C + 1):&lt;br /&gt;
        if selected[i]:&lt;br /&gt;
            continue&lt;br /&gt;
        &lt;br /&gt;
        li, ls, before = 1, nelems, 0&lt;br /&gt;
        &lt;br /&gt;
        while li &amp;lt;= ls:&lt;br /&gt;
            mid = (li + ls) // 2&lt;br /&gt;
            if row[elems[mid]] &amp;lt;= row[i] and col[elems[mid]] &amp;lt;= col[i]:&lt;br /&gt;
                before = mid&lt;br /&gt;
                li = mid + 1&lt;br /&gt;
            else:&lt;br /&gt;
                ls = mid - 1&lt;br /&gt;
        &lt;br /&gt;
        if before == 0:&lt;br /&gt;
            continue&lt;br /&gt;
        &lt;br /&gt;
        if row[i] &amp;lt;= row[elems[before + 1]] and col[i] &amp;lt;= col[elems[before + 1]]:&lt;br /&gt;
            for j in range(nelems, before, -1):&lt;br /&gt;
                elems[j + 1] = elems[j]&lt;br /&gt;
            elems[before + 1] = i&lt;br /&gt;
            nelems += 1&lt;br /&gt;
            selected[i] = 1&lt;br /&gt;
&lt;br /&gt;
    if nelems != R + C - 1:&lt;br /&gt;
        with open(&amp;quot;bemoOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Not enough elements selected!\n&amp;quot;)&lt;br /&gt;
        sys.exit()&lt;br /&gt;
&lt;br /&gt;
def WriteOutput():&lt;br /&gt;
    with open(&amp;quot;bemoOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        for i in range(1, nelems + 1):&lt;br /&gt;
            f.write(f&amp;quot;{elems[i]}&amp;quot;)&lt;br /&gt;
            if i &amp;lt; nelems:&lt;br /&gt;
                f.write(&amp;quot; &amp;quot;)&lt;br /&gt;
        f.write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    ReadInput()&lt;br /&gt;
    Solve()&lt;br /&gt;
    WriteOutput()&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1115_-_Avarcolaci&amp;diff=9785</id>
		<title>1115 - Avarcolaci</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1115_-_Avarcolaci&amp;diff=9785"/>
		<updated>2024-05-18T07:45:45Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un vârcolac bântuie ulițele satului Bosston, semănând panică printre săteni. Satul Bosston este compus din &amp;lt;code&amp;gt;2*N&amp;lt;/code&amp;gt; săteni, fiecare dintre aceștia fiind rudă cu exact un vârcolac. Vârcolacii sunt codificați cu numere naturale. Pentru a afla care este vârcolacul care le cauzează probleme, aceștia s-au dus la vraciul local. Acesta a spus că, dacă există un vârcolac &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; astfel încât oricum s-ar împărți cei &amp;lt;code&amp;gt;2*N&amp;lt;/code&amp;gt; săteni în două grupuri de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; săteni, există cel puțin un sătean în primul grup și cel puțin un sătean în al doilea care să fie rude cu &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, atunci vârcolacul &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; sigur este cel care bântuie satul. Dacă nu există un astfel de vârcolac, atunci sătenii nu își pot da seama cine le bântuie satul.&lt;br /&gt;
&lt;br /&gt;
= Cerință =&lt;br /&gt;
Cunoscând &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și indicii vârcolacilor cu care se înrudesc fiecare dintre cei &amp;lt;code&amp;gt;2*N&amp;lt;/code&amp;gt; săteni, să se determine vârcolacul care bântuie satul, în cazul în care acesta există.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;avarcolaciIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; de teste. Următoarele &amp;lt;code&amp;gt;2*T&amp;lt;/code&amp;gt; linii conțin cele &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; teste. Prima linie dintr-un test conține numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, indicând faptul că avem &amp;lt;code&amp;gt;2*N&amp;lt;/code&amp;gt; săteni în Bosston. Următoarea linie conține &amp;lt;code&amp;gt;2*N&amp;lt;/code&amp;gt; elemente, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea dintre aceste elemente reprezentând indicele vârcolacului cu care este rudă al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea sătean.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;avarcolaciOUt.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; linii, câte una pentru fiecare test din fișierul de intrare. Dacă vârcolacul care bântuie satul nu poate fi determinat, atunci se va afișa textul ”Mozart” (fără ghilimele). Dacă vârcolacul poate fi determinat, atunci se va afișă indicele acestuia. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ T ≤ 15&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N ≤ 500.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 10% din teste se garantează că &amp;lt;code&amp;gt;N = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 20% din teste se garantează că &amp;lt;code&amp;gt;N &amp;lt; 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 40% din teste se garantează că &amp;lt;code&amp;gt;N &amp;lt;= 500&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 80% din teste se garantează că &amp;lt;code&amp;gt;N &amp;lt;= 50.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Indicii vârcolacilor sunt numere întregi pozitive mai mici ca &amp;lt;code&amp;gt;109&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 50% din teste indicii vârcolacilor sunt mai mici strict ca &amp;lt;code&amp;gt;32762&amp;lt;/code&amp;gt;&lt;br /&gt;
* ATENȚIE! Satul conține &amp;lt;code&amp;gt;2*N&amp;lt;/code&amp;gt; săteni!&lt;br /&gt;
* ATENȚIE la limita de memorie!&lt;br /&gt;
* ATENȚIE! În cazul în care sunt mai multe soluții pentru vârcolacul care bântuie satul, se acceptă oricare dintre ele.&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;avarcolaciIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 2&lt;br /&gt;
 1 4 3 4&lt;br /&gt;
 1&lt;br /&gt;
 1 1&lt;br /&gt;
 3&lt;br /&gt;
 4 1 4 4 4 4&lt;br /&gt;
&amp;lt;code&amp;gt;avarcolaciOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Mozart&lt;br /&gt;
 1&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
&lt;br /&gt;
# Dacă împărțim în grupuri vârcolacii asociați celor &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; săteni obținem &amp;lt;code&amp;gt;(1, 3) (4, 4)&amp;lt;/code&amp;gt; și nu avem un vârcolac atât în primul grup, cât și în al doilea.&lt;br /&gt;
# Vârcolacul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; bântuie satul.&lt;br /&gt;
# Vârcolacul &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; bântuie satul – nu putem împărți sătenii în două grupuri astfel încât &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; să nu fie în niciunul dintre ele.&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;avarcolaciIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 16&lt;br /&gt;
 2&lt;br /&gt;
 1 4 3 4&lt;br /&gt;
 1&lt;br /&gt;
 1 1&lt;br /&gt;
 3&lt;br /&gt;
 4 1 4 4 4 4&lt;br /&gt;
&amp;lt;code&amp;gt;avarcolaciOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(nr_teste, n, el):&lt;br /&gt;
    TMAX = 15&lt;br /&gt;
    NMAX = 500000&lt;br /&gt;
    EL_MAX = int(1e9)&lt;br /&gt;
&lt;br /&gt;
    if not (1 &amp;lt;= nr_teste &amp;lt;= TMAX):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= NMAX):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (0 &amp;lt;= el &amp;lt;= EL_MAX):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;avarcolaciIN.txt&amp;quot;, &amp;quot;rt&amp;quot;) as f_in, open(&amp;quot;avarcolaciOUt.txt&amp;quot;, &amp;quot;wt&amp;quot;) as f_out:&lt;br /&gt;
        nr_teste = int(f_in.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        if not verifica_restrictii(nr_teste, 1, 0):&lt;br /&gt;
            f_out.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        potential = [0] * (nr_teste + 1)&lt;br /&gt;
&lt;br /&gt;
        for test in range(1, nr_teste + 1):&lt;br /&gt;
            n = int(f_in.readline().strip())&lt;br /&gt;
            if not verifica_restrictii(1, n, 0):&lt;br /&gt;
                f_out.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
&lt;br /&gt;
            maj, cnt = -1, 0&lt;br /&gt;
&lt;br /&gt;
            elements = list(map(int, f_in.readline().split()))&lt;br /&gt;
            if not all(verifica_restrictii(1, 1, el) for el in elements):&lt;br /&gt;
                f_out.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
&lt;br /&gt;
            for el in elements:&lt;br /&gt;
                if maj == -1:&lt;br /&gt;
                    maj = el&lt;br /&gt;
                    cnt = 1&lt;br /&gt;
                else:&lt;br /&gt;
                    if el == maj:&lt;br /&gt;
                        cnt += 1&lt;br /&gt;
                    else:&lt;br /&gt;
                        cnt -= 1&lt;br /&gt;
                        if cnt == 0:&lt;br /&gt;
                            maj = el&lt;br /&gt;
                            cnt = 1&lt;br /&gt;
&lt;br /&gt;
            potential[test] = maj&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;avarcolaciIN.txt&amp;quot;, &amp;quot;rt&amp;quot;) as f_in:&lt;br /&gt;
        nr_teste = int(f_in.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        for test in range(1, nr_teste + 1):&lt;br /&gt;
            n = int(f_in.readline().strip())&lt;br /&gt;
            elements = list(map(int, f_in.readline().split()))&lt;br /&gt;
&lt;br /&gt;
            cnt = 0&lt;br /&gt;
            for x in elements:&lt;br /&gt;
                if x == potential[test]:&lt;br /&gt;
                    cnt += 1&lt;br /&gt;
&lt;br /&gt;
            with open(&amp;quot;avarcolaciOUt.txt&amp;quot;, &amp;quot;a&amp;quot;) as f_out:&lt;br /&gt;
                if cnt &amp;gt; n:&lt;br /&gt;
                    f_out.write(f&amp;quot;{potential[test]}\n&amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    f_out.write(&amp;quot;Mozart\n&amp;quot;)&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1117_-_Volum&amp;diff=9784</id>
		<title>1117 - Volum</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1117_-_Volum&amp;diff=9784"/>
		<updated>2024-05-18T07:39:03Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;K.L. 2.0 și-a dorit o piscină pe un grid &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. Cum K.L. 2.0 nu a fost foarte inspirat, el a uitat să își niveleze terenul înainte de a construi piscina, astfel încât fiecare celulă de coordonate &amp;lt;code&amp;gt;(i, j)&amp;lt;/code&amp;gt; a gridului are o înalțime &amp;lt;code&amp;gt;Ai,j&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1 ≤ j ≤ M&amp;lt;/code&amp;gt;). La un moment dat începe o ploaie puternică, care umple piscina cu apă. După terminarea ploii, K.L. 2.0 se întreabă câtă apă are în piscină.&lt;br /&gt;
&lt;br /&gt;
Dintr-o celulă apa se varsă în celulele vecine cu care are o latură comună şi care au înălţimea strict mai mică decât celula curentă. Apa de pe marginea piscinei se scurge în exterior.&lt;br /&gt;
&lt;br /&gt;
= Cerință =&lt;br /&gt;
Pentru &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; și gridul &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; date, să se determine volumul de apă care a rămas în piscină.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;volumIN.txt&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;M&amp;lt;/code&amp;gt;, reprezentând dimensiunile grid-ului, iar pe fiecare dintre următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află câte &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; numere, reprezentând înălțimile terenului, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;volumOUT.txt&amp;lt;/code&amp;gt; va conține un singur număr, reprezentând volumul de apă care a rămas în piscină. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ N, M ≤ 752&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ Ai,j ≤ 109 + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 30% din punctaj, &amp;lt;code&amp;gt;3 ≤ N, M ≤ 82&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru 40% din punctaj, &amp;lt;code&amp;gt;0 ≤ Ai,j ≤ 103 + 2&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Volumul apei este suma unităţilor de apă care rămâne în celulele piscinei.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;volum.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 3&lt;br /&gt;
 2 2 2&lt;br /&gt;
 2 0 2&lt;br /&gt;
 2 2 2&lt;br /&gt;
&amp;lt;code&amp;gt;volum.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
După ploaie rămân două unități de apă în celula cu înălțimea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Nu pot rămâne &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; unități, deoarece o unitate s-ar scurge prin una din cele 4 celule vecine în exteriorul piscinei.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;volumIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 3&lt;br /&gt;
 3 3 3&lt;br /&gt;
 3 0 2&lt;br /&gt;
 3 3 3&lt;br /&gt;
&amp;lt;code&amp;gt;volumOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
După ploaie rămân două unități de apă în celula cu înălțimea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Nu pot rămâne &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; unități, deoarece o unitate s-ar scurge prin celula vecină cu valoarea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; în exteriorul piscinei.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: ==&lt;br /&gt;
&amp;lt;code&amp;gt;volumIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 3&lt;br /&gt;
 3 3 3&lt;br /&gt;
 3 0 2&lt;br /&gt;
 3 3 3&lt;br /&gt;
&amp;lt;code&amp;gt;volumOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
= Exemplul 4: =&lt;br /&gt;
&amp;lt;code&amp;gt;volumIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5&lt;br /&gt;
 2 2 3 3 3&lt;br /&gt;
 2 2 3 1 3&lt;br /&gt;
 2 3 1 3 3&lt;br /&gt;
 2 2 3 2 2&lt;br /&gt;
 2 2 2 2 2&lt;br /&gt;
&amp;lt;code&amp;gt;volumOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
După ploaie rămân câte două unități de apă în celulele cu înălțimea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Nu pot rămâne câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; unități. De exemplu, din celula &amp;lt;code&amp;gt;(2,4)&amp;lt;/code&amp;gt; apa se poate scurge în celula &amp;lt;code&amp;gt;(2,5)&amp;lt;/code&amp;gt; şi apoi în exterior, respectiv din celula &amp;lt;code&amp;gt;(3,3)&amp;lt;/code&amp;gt; în şirul de celule &amp;lt;code&amp;gt;(4,3) - (5,3)&amp;lt;/code&amp;gt; şi apoi în exterior.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
maxn = 755&lt;br /&gt;
n, m = 0, 0&lt;br /&gt;
v = [[0] * maxn for _ in range(maxn)]&lt;br /&gt;
f = [[0] * maxn for _ in range(maxn)]&lt;br /&gt;
sol = 0&lt;br /&gt;
hp = []&lt;br /&gt;
d1 = [0, 0, -1, 1]&lt;br /&gt;
d2 = [1, -1, 0, 0]&lt;br /&gt;
&lt;br /&gt;
def add_element(x, y, h):&lt;br /&gt;
    global sol&lt;br /&gt;
    if x &amp;lt;= 0 or y &amp;lt;= 0 or x &amp;gt; n or y &amp;gt; m:&lt;br /&gt;
        return&lt;br /&gt;
    if f[x][y] == 1:&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if h &amp;lt; v[x][y]:&lt;br /&gt;
        h = v[x][y]&lt;br /&gt;
    sol += h - v[x][y]&lt;br /&gt;
&lt;br /&gt;
    heapq.heappush(hp, (h, x, y))&lt;br /&gt;
    f[x][y] = 1&lt;br /&gt;
&lt;br /&gt;
def check_constraints():&lt;br /&gt;
    if not (3 &amp;lt;= n &amp;lt;= 752 and 3 &amp;lt;= m &amp;lt;= 752):&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(1, m + 1):&lt;br /&gt;
            if not (0 &amp;lt;= v[i][j] &amp;lt;= 10**9 + 2):&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global n, m, sol&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;volumIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            v[i][1:m + 1] = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
    if not check_constraints():&lt;br /&gt;
        with open(&amp;quot;volumOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        add_element(i, 1, v[i][1])&lt;br /&gt;
        add_element(i, m, v[i][m])&lt;br /&gt;
    for j in range(1, m + 1):&lt;br /&gt;
        add_element(1, j, v[1][j])&lt;br /&gt;
        add_element(n, j, v[n][j])&lt;br /&gt;
&lt;br /&gt;
    while len(hp) &amp;gt; 0:&lt;br /&gt;
        hc, xc, yc = heapq.heappop(hp)&lt;br /&gt;
&lt;br /&gt;
        for i in range(4):&lt;br /&gt;
            add_element(xc + d1[i], yc + d2[i], hc)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;volumOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{sol}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1042_-_Subsecvente&amp;diff=9783</id>
		<title>1042 - Subsecvente</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1042_-_Subsecvente&amp;diff=9783"/>
		<updated>2024-05-18T07:20:48Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Fie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; un număr natural și &amp;lt;code&amp;gt;M={S1,S2,…,Sn}&amp;lt;/code&amp;gt; o mulțime de șiruri de caractere nevide. Fie &amp;lt;code&amp;gt;Sk&amp;lt;/code&amp;gt; un șir de caractere din &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. Atunci, orice caracter al lui &amp;lt;code&amp;gt;Sk&amp;lt;/code&amp;gt; aparține mulțimii &amp;lt;code&amp;gt;{&#039;a&#039;,&#039;b&#039;}&amp;lt;/code&amp;gt;. Notăm prin &amp;lt;code&amp;gt;|Sk|&amp;lt;/code&amp;gt; numărul caracterelor șirului &amp;lt;code&amp;gt;Sk&amp;lt;/code&amp;gt; sau, echivalent, lungimea sa. O subsecvență &amp;lt;code&amp;gt;Sk[i:j]&amp;lt;/code&amp;gt; a lui &amp;lt;code&amp;gt;Sk&amp;lt;/code&amp;gt; este formată din caracterele situate pe pozițiile consecutive &amp;lt;code&amp;gt;i, i+1, .., j&amp;lt;/code&amp;gt;. Astfel, dacă &amp;lt;code&amp;gt;Sk = &#039;abbbaababa&#039;&amp;lt;/code&amp;gt;, atunci &amp;lt;code&amp;gt;Sk[3:6] = &#039;bbaa&#039;&amp;lt;/code&amp;gt; sau subsecvența evidențiată: &amp;lt;code&amp;gt;&#039;abbbaababa&#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind dată o mulțime &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, se cere să se determine lungimea maximă a unei subsecvențe care se găsește în toate șirurile din &amp;lt;code&amp;gt;M&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;subsecventeIN.txt&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; egal cu cardinalul mulțimii &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. Pe fiecare din următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii se găsește câte un șir din mulțimea &amp;lt;code&amp;gt;M&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;subsecventeOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie un singur număr natural egal cu lungimea subsecvenței găsite. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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; 5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Dacă &amp;lt;code&amp;gt;|S| = |S1| + |S2| + … + |Sn|&amp;lt;/code&amp;gt;, atunci &amp;lt;code&amp;gt;|S| &amp;lt; 50 001&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se garantează că va exista întotdeauna soluție&lt;br /&gt;
* Se garantează că rezultatul nu va depăși &amp;lt;code&amp;gt;60&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste: &amp;lt;code&amp;gt;|S| &amp;lt; 101&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;55%&amp;lt;/code&amp;gt; din teste: &amp;lt;code&amp;gt;|S| &amp;lt; 3 501&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;80%&amp;lt;/code&amp;gt; din teste: &amp;lt;code&amp;gt;|S| &amp;lt; 10 001&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subsecventeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 abbabaaaaabb&lt;br /&gt;
 aaaababab&lt;br /&gt;
 bbbbaaaab&lt;br /&gt;
 aaaaaaabaaab&lt;br /&gt;
&amp;lt;code&amp;gt;subsecventeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Lungimea unei subsecvenţe comune de lungime maximă este &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
În exemplu subsecvența comună de lungime &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;aaaab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;abbabaaaaabb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;aaaababab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bbbbaaaab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;aaaaaaabaaab&amp;lt;/code&amp;gt;.&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;subsecventeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 abbabaaaaabb&lt;br /&gt;
 aaaababab&lt;br /&gt;
 bbbbaaaab&lt;br /&gt;
 aaaaaaabaaab&lt;br /&gt;
&amp;lt;code&amp;gt;subsecventeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
# Definim constantele&lt;br /&gt;
NODES = 2600100&lt;br /&gt;
&lt;br /&gt;
# Inițializăm variabilele&lt;br /&gt;
p2, lg, mask, i, j, k, p, q, n = 0, 0, 0, 0, 0, 0, 0, 0, 0&lt;br /&gt;
s = [[0] * NODES for _ in range(2)]&lt;br /&gt;
cod = [0] * NODES&lt;br /&gt;
a = [&amp;quot;&amp;quot;] * 50010&lt;br /&gt;
&lt;br /&gt;
def sol(nod):&lt;br /&gt;
    if not nod or cod[nod] != mask:&lt;br /&gt;
        return 0&lt;br /&gt;
    sa = sol(s[0][nod])&lt;br /&gt;
    sb = sol(s[1][nod])&lt;br /&gt;
    return max(sa, sb) + 1&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global p2, lg, mask, i, j, k, p, q, n&lt;br /&gt;
    # Citim datele de intrare&lt;br /&gt;
    with open(&amp;quot;subsecventeIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile:&lt;br /&gt;
        data = infile.read().strip().split()&lt;br /&gt;
&lt;br /&gt;
    n = int(data[0])&lt;br /&gt;
    sequences = data[1:]&lt;br /&gt;
&lt;br /&gt;
    # Verificăm restricțiile&lt;br /&gt;
    if not (1 &amp;lt; n &amp;lt; 5) or sum(len(seq) for seq in sequences) &amp;gt;= 50001:&lt;br /&gt;
        with open(&amp;quot;subsecventeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    p2 = 1&lt;br /&gt;
    n = 1&lt;br /&gt;
    mask = 0&lt;br /&gt;
    for sequence in sequences:&lt;br /&gt;
        lg = len(sequence)&lt;br /&gt;
        mask |= p2&lt;br /&gt;
        for i in range(1, lg + 1):&lt;br /&gt;
            j = min(i + 59, lg)&lt;br /&gt;
            p = 1&lt;br /&gt;
            for k in range(i, j + 1):&lt;br /&gt;
                q = ord(sequence[k-1]) - ord(&#039;a&#039;)&lt;br /&gt;
                if not s[q][p]:&lt;br /&gt;
                    s[q][p] = n + 1&lt;br /&gt;
                    n += 1&lt;br /&gt;
                p = s[q][p]&lt;br /&gt;
                cod[p] |= p2&lt;br /&gt;
        p2 &amp;lt;&amp;lt;= 1&lt;br /&gt;
&lt;br /&gt;
    cod[1] = mask&lt;br /&gt;
    result = sol(1) - 1&lt;br /&gt;
    with open(&amp;quot;subsecventeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
        outfile.write(f&amp;quot;{result}\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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0739_-_Cuburi_1&amp;diff=9782</id>
		<title>0739 - Cuburi 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0739_-_Cuburi_1&amp;diff=9782"/>
		<updated>2024-05-18T07:13:50Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Fie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi de aceeaşi mărime, cu feţe colorate. Culorile sunt codificate prin câte o literă de la &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. Pentru fiecare cub se cunosc culorile feţelor în ordinea: bază, capac, faţă frontală, faţă laterală dreapta, faţa din spate, faţă laterală stânga. Să se determine numărul maxim de cuburi care, răsturnate şi rotite convenabil, pot fi puse unul peste altul astfel încât să formeze un turn cu toate feţele uniform colorate (fiecare faţă a turnului sa fie de aceeaşi culoare, de la primul, până la ultimul cub al turnului).&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;cuburi1IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de cuburi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii culorile fețelor celor &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;cuburi1OUt.txt&amp;lt;/code&amp;gt; va conține pe prima linie un singur număr ce reprezintă numărul maxim de cuburi care, răsturnate şi rotite convenabil, pot fi puse unul peste altul astfel încât să formeze un turn cu feţele uniform colorate. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ n ≤ 50000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cuburile ce formează un turn sunt aşezate numai unul peste celalalt, nu şi unul lângă celălalt;&lt;br /&gt;
* culorile fetelor unui cub se pot repeta pentru două sau mai multe dintre cele 6 feţe ale sale;&lt;br /&gt;
* orice cub poate fi rotit sau răsturnat pentru a fi adus într-o poziţie convenabilă;&lt;br /&gt;
* culorile fetelor cuburilor care nu formează feţele laterale ale turnului nu au nici o importanţă;&lt;br /&gt;
* culorile fețelor sunt litere mari din mulțimea &amp;lt;code&amp;gt;{A,B,...,M}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;cuburi1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 ACADEB&lt;br /&gt;
 FBCDAE&lt;br /&gt;
 AEDCBB&lt;br /&gt;
&amp;lt;code&amp;gt;cuburi1OUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Exemplu 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;cuburi1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3000000000&lt;br /&gt;
 ACADEB&lt;br /&gt;
 FBCDAE&lt;br /&gt;
 AEDCBB&lt;br /&gt;
&amp;lt;code&amp;gt;cuburi1OUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Primul cub poate fi păstrat în poziţia sa, având feţele laterale &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; (frontal, lateral-dreapta, spate, lateral-stânga), iar al treilea cub poate fi răsturnat astfel încât să aibă capacele &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, şi rotit astfel încât să aibă feţele laterale să fie tot &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;.Rezolvare&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
&lt;br /&gt;
def f(a, b, c, d, i, v, verif):&lt;br /&gt;
    if c &amp;lt; a:&lt;br /&gt;
        a, c = c, a&lt;br /&gt;
    if d &amp;lt; b:&lt;br /&gt;
        b, d = d, b&lt;br /&gt;
    if b &amp;lt; a or (b == a and d &amp;lt; c):&lt;br /&gt;
        a, b = b, a&lt;br /&gt;
        c, d = d, c&lt;br /&gt;
    rez = a + b + c + d&lt;br /&gt;
    if verif[rez] != i:&lt;br /&gt;
        verif[rez] = i&lt;br /&gt;
        v[rez] += 1&lt;br /&gt;
        return v[rez]&lt;br /&gt;
    verif[rez] = i&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;cuburi1IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile:&lt;br /&gt;
            n = int(infile.readline().strip())&lt;br /&gt;
            if not (0 &amp;lt;= n &amp;lt;= 50000):&lt;br /&gt;
                raise ValueError&lt;br /&gt;
            &lt;br /&gt;
            v = defaultdict(int)&lt;br /&gt;
            verif = defaultdict(int)&lt;br /&gt;
            mx = 0&lt;br /&gt;
&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                c = infile.readline().strip()&lt;br /&gt;
                if len(c) != 6 or not all(&#039;A&#039; &amp;lt;= char &amp;lt;= &#039;M&#039; for char in c):&lt;br /&gt;
                    raise ValueError&lt;br /&gt;
                &lt;br /&gt;
                mx = max(mx, f(c[2], c[3], c[4], c[5], i, v, verif))&lt;br /&gt;
                mx = max(mx, f(c[0], c[3], c[1], c[5], i, v, verif))&lt;br /&gt;
                mx = max(mx, f(c[0], c[2], c[1], c[4], i, v, verif))&lt;br /&gt;
        &lt;br /&gt;
        with open(&amp;quot;cuburi1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(str(mx))&lt;br /&gt;
    &lt;br /&gt;
    except ValueError:&lt;br /&gt;
        with open(&amp;quot;cuburi1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&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>Oros Ioana Diana</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0707_-_Sum_K&amp;diff=9781</id>
		<title>0707 - Sum K</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0707_-_Sum_K&amp;diff=9781"/>
		<updated>2024-05-18T07:08:26Z</updated>

		<summary type="html">&lt;p&gt;Oros Ioana Diana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;sumk&amp;lt;/code&amp;gt; este un joc de perspicacitate, cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; stagii 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;. Un joc se termină cu succes dacă jucătorul a parcurs în ordine, 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;, toate cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; stagii ale jocului şi în fiecare stagiu a obţinut exact &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; puncte. Fiecare stagiu are &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; niveluri, numerotate de asemenea 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;. Jucătorul are posibilitatea să câştige &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; puncte pe oricare nivel al stagiului curent.&lt;br /&gt;
&lt;br /&gt;
Dacă jucătorul se găseşte în stagiul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; pe nivelul &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; și numărul total de puncte obţinute până în acel moment în acest stagiu este mai mic decât &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, el va trece în mod obligatoriu pe nivelul &amp;lt;code&amp;gt;j+1&amp;lt;/code&amp;gt; al stagiului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Dacă jucătorul primește cel puţin un punct pe nivelul &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; și astfel punctajul său în stagiul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; devine exact &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, atunci jucătorul trece în mod automat pe nivelul &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; al stagiului &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; sau termină jocul cu succes dacă &amp;lt;code&amp;gt;i=N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; de stagii ale jocului şi numărul &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; de puncte care trebuie să fie obţinute în fiecare stagiu, să se determine numărul de posibilităţi modulo &amp;lt;code&amp;gt;578537&amp;lt;/code&amp;gt; pentru ca jocul să se termine cu succes.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;sumkIN.txt&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale &amp;lt;code&amp;gt;N K&amp;lt;/code&amp;gt; cu semnificația descrisă anterior.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;sumkOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie un singur număr natural &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; reprezentând numărul total de posibilităţi modulo &amp;lt;code&amp;gt;578537&amp;lt;/code&amp;gt; pentru ca jocul să se termine cu succes. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&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 ≤ 500&amp;lt;/code&amp;gt;&lt;br /&gt;
* Fie &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; punctajul final într-un stagiu oarecare. Atunci dacă &amp;lt;code&amp;gt;x ≠  K&amp;lt;/code&amp;gt;, jocul se termină cu eșec.&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;20%&amp;lt;/code&amp;gt; din teste, &amp;lt;code&amp;gt;K ≤ N ≤ 10&amp;lt;/code&amp;gt;, iar pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste, &amp;lt;code&amp;gt;K≤N≤100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;sumkIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2&lt;br /&gt;
&amp;lt;code&amp;gt;sumkOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
= Exemplu 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;sumkIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 3&lt;br /&gt;
&amp;lt;code&amp;gt;sumkOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def calcul(z1, z2, n, a):&lt;br /&gt;
    x = [0] * 502&lt;br /&gt;
    for j in range(1, n + 1):&lt;br /&gt;
        s = 0&lt;br /&gt;
        for i in range(1, j + 1):&lt;br /&gt;
            t = z1[i]&lt;br /&gt;
            t = (t * z2[j - i + 1]) % a&lt;br /&gt;
            s = (s + t) % a&lt;br /&gt;
        x[j] = s&lt;br /&gt;
    for j in range(1, n + 1):&lt;br /&gt;
        z1[j] = x[j]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;sumkIN.txt&amp;quot;, &amp;quot;rt&amp;quot;) as fin:&lt;br /&gt;
            n, k = map(int, fin.readline().split())&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        with open(&amp;quot;sumkOUT.txt&amp;quot;, &amp;quot;wt&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Eroare la citirea datelor de intrare.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt;= n &amp;lt;= 500):&lt;br /&gt;
        with open(&amp;quot;sumkOUT.txt&amp;quot;, &amp;quot;wt&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    r = [0] * 502&lt;br /&gt;
    z = [0] * 502&lt;br /&gt;
    r[1] = 1&lt;br /&gt;
    a = 578537&lt;br /&gt;
&lt;br /&gt;
    for j in range(1, k + 1):&lt;br /&gt;
        for i in range(2, n + 1):&lt;br /&gt;
            r[i] = (r[i - 1] + r[i]) % a&lt;br /&gt;
&lt;br /&gt;
    v = n&lt;br /&gt;
    z[1] = 1&lt;br /&gt;
    while v != 0:&lt;br /&gt;
        if v % 2 == 1:&lt;br /&gt;
            calcul(z, r, n, a)&lt;br /&gt;
        calcul(r, r, n, a)&lt;br /&gt;
        v = v // 2&lt;br /&gt;
&lt;br /&gt;
    s = 0&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        s = (s + z[i]) % a&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;sumkOUT.txt&amp;quot;, &amp;quot;wt&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{int(s)}&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>Oros Ioana Diana</name></author>
	</entry>
</feed>