<?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=Mraa</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=Mraa"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Mraa"/>
	<updated>2026-05-01T20:50:08Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3982_-_Descp2&amp;diff=9446</id>
		<title>3982 - Descp2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3982_-_Descp2&amp;diff=9446"/>
		<updated>2024-01-11T18:35:54Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Considerăm trei numere naturale nenule: n, k şi x. Denumim o kx-descompunere a numărului n o posibilitate de a scrie numărul n ca sumă de k numere naturale nenule astfel încât diferenţa între oricare doi termeni ai sumei este cel puţin egală cu x.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Fiind date trei numere naturale n, k şi x, să se determine câte kx-descompuneri distincte există. Două kx-descompuneri sunt distincte dacă diferă prin cel puţin un termen.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare kx_desc.in conține pe prima linie trei valori naturale nenule reprezentând numerele n, k şi x.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire kx_desc.out va conține o singură valoare reprezentând restul împărţirii numărului de kx-descompuneri distincte la numărul 10007.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
Pentru 20% din teste 0 &amp;lt; n ≤ 200; pentru celelalte 80% din teste, 200 &amp;lt; n ≤ 10000;&lt;br /&gt;
1 ≤ x, k ≤ n&lt;br /&gt;
==Exemplul 1==:&lt;br /&gt;
kx_desc.in&lt;br /&gt;
&lt;br /&gt;
20 2 3&lt;br /&gt;
kx_desc.out&lt;br /&gt;
&lt;br /&gt;
8&lt;br /&gt;
==Explicație==&lt;br /&gt;
Numărul de kx-descompuneri în acest caz este 8. Acestea sunt formate din numerele 1 şi 19; 2 şi 18; 3 şi 17; 4 şi 16; 5 şi 15; 6 şi 14; 7 şi 13; 8 şi 12.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==:&lt;br /&gt;
kx_desc.in&lt;br /&gt;
&lt;br /&gt;
2000 19 7&lt;br /&gt;
kx_desc.out&lt;br /&gt;
&lt;br /&gt;
3184&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 10007&lt;br /&gt;
&lt;br /&gt;
def kx_descompuneri(n, k, x):&lt;br /&gt;
&lt;br /&gt;
   dp = [[0] * (x + 1) for _ in range(n + 1)]&lt;br /&gt;
   dp[0][0] = 1&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       for j in range(1, min(i, k) + 1):&lt;br /&gt;
           for l in range(x + 1):&lt;br /&gt;
               dp[i][l] = (dp[i][l] + dp[i - j][l - 1]) % MOD&lt;br /&gt;
   rezultat = 0&lt;br /&gt;
   for i in range(n - k * x + 1, n + 1):&lt;br /&gt;
       rezultat = (rezultat + dp[i][x]) % MOD&lt;br /&gt;
   return rezultat&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n, k, x = map(int, input().split())&lt;br /&gt;
   # Calculăm rezultatul și îl afișăm&lt;br /&gt;
   rezultat = kx_descompuneri(n, k, x)&lt;br /&gt;
   print(rezultat)&lt;br /&gt;
python kx_desc.py &amp;lt; kx_desc.in&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3828_-_D_Caesar_Queries&amp;diff=9445</id>
		<title>3828 - D Caesar Queries</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3828_-_D_Caesar_Queries&amp;diff=9445"/>
		<updated>2024-01-11T18:35:13Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
După ce Julius Caesar l-a învins pe Pompey în bătălia de la Pharsalus , acesta decide să țină un festin în cinstea soldaților săi loilai . El are q scenarii posibile pt oaspeți definite printr o pereche (n,k) care înseamnă că fiecare dintre cei n invitați pot alege unul dintre cele k feluri de mâncare . Deoarece Julius Caesar a plătit cei mai buni bucătari pentru a prepara mancarea , el își dorește ca fiecare fel de mâncare să fi fost ales de minimum un invitat. O configurație este un șir de n numere a , al i-lea soldat a ales felul a(i) . Câte configurații distincte există care să îndeplinească cerințele marelui Julius Caesar ? Două șiruri sunt distincte dacă diferă prin cel puțin o poziție.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare caesar.in conține pe prima linie un număr q care reprezintă numărul de scenarii la care trebuie să răspundeți urmate de q linii , pe fiecare aflându-se o pereche (n , k) reprezentatnd numărul de invitați , respectiv numărul de feluri de mâncare disponibile.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire caesar.out conține pe q linii răspunsul pentru fiecare scenariu modulo 666013.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
Q &amp;lt;= 100.000 , N &amp;lt;= 2000 K &amp;lt;= 2000 pentru orice query.&lt;br /&gt;
Pentru 20 puncte  Q = 1.&lt;br /&gt;
Pentru alte 20 de puncte  N , K &amp;lt;= 200.&lt;br /&gt;
Exemplu:&lt;br /&gt;
caesar.in&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
2 2&lt;br /&gt;
caesar.out&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
caesar.in&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
5 4&lt;br /&gt;
caesar.out&lt;br /&gt;
&lt;br /&gt;
240&lt;br /&gt;
==Explicație==&lt;br /&gt;
În primul exemplu , dacă notăm cu 1 primul fel de mâncare și cu 2 al doilea fel de mâncare , atunci configurațiile bune sunt : 12 și 21 ( primul soldat poate alege ori primul ori al doilea fel de mâncare , iar al doilea alege felul de mâncare pe care nu l-a ales primul soldat pentru că toate felurile de mâncare să fie alese de cel puțin un soldat )&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 666013&lt;br /&gt;
&lt;br /&gt;
def numar_configuratii(n, k):&lt;br /&gt;
&lt;br /&gt;
   total_aranjamente = pow(k, n, MOD)&lt;br /&gt;
   aranjamente_fara_un_fel = pow(k-1, n, MOD)&lt;br /&gt;
   rezultat = (total_aranjamente - aranjamente_fara_un_fel) % MOD&lt;br /&gt;
   return rezultat&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim numărul de scenarii&lt;br /&gt;
   q = int(input())&lt;br /&gt;
   # Pentru fiecare scenariu, citim valorile și calculăm rezultatul&lt;br /&gt;
   for _ in range(q):&lt;br /&gt;
       n, k = map(int, input().split())&lt;br /&gt;
       rezultat = numar_configuratii(n, k)&lt;br /&gt;
       print(rezultat)&lt;br /&gt;
&lt;br /&gt;
python caesar.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3827_-_C_Bombs&amp;diff=9444</id>
		<title>3827 - C Bombs</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3827_-_C_Bombs&amp;diff=9444"/>
		<updated>2024-01-11T18:34:36Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Le Quack vrea să bombardeze un oraș având N bombe numerotate de la 1...N. Dacă el detonează bombă cu valorea i atunci va putea să detoneze doar bombe încă nedetonate cu valori mai mici decât i. În cazul în care nu mai există astfel de bombe , poate detona orice bombă nedetonata. Le Quack va da numărul N și vrea să îi spuneți în câte moduri poate detona toate cele N bombe după regulă descrisă anterior.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Inputul conține un număr natural n , reprezentând numărul de bombe pe care le are Le Quack.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Outputul conține răspunsul modulo 666013.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
N ≤ 2000.&lt;br /&gt;
Pentru teste în valoare de 10p, N ≤ 9.&lt;br /&gt;
Pentru restul testelor în valoare de 90p, N ≤ 2000.&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
bombs.in&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
bombs.out&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
bombs.in&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
bombs.out&lt;br /&gt;
&lt;br /&gt;
5&lt;br /&gt;
==Explicație==&lt;br /&gt;
În primul exemplu, configurațiile posibile sunt: [1 , 2] și [2 , 1].&lt;br /&gt;
În al doilea exemplu, configurațiile posibile sunt: [1 , 2 , 3] , [3 , 2 , 1] , [2 , 1 , 3] , [3 , 1 , 2] , [1 , 3 , 2]. Configurația [2 , 3 , 1] nu este bună, deoarece am luat bombă 3 înainte să termin toate bombele cu indici mai mici decât 2, ceea ce contrazice regula lui Le Quack.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 666013&lt;br /&gt;
&lt;br /&gt;
def numar_moduri_detonare(n):&lt;br /&gt;
&lt;br /&gt;
   DP = [0] * (n + 1)&lt;br /&gt;
   DP[0] = 1&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       for j in range(i):&lt;br /&gt;
           DP[i] = (DP[i] + DP[j]) % MOD&lt;br /&gt;
   return DP[n]&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n = int(input())&lt;br /&gt;
   # Calculăm rezultatul și afișăm rezultatul&lt;br /&gt;
   rezultat = numar_moduri_detonare(n)&lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3639_-_Subset_Fight&amp;diff=9443</id>
		<title>3639 - Subset Fight</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3639_-_Subset_Fight&amp;diff=9443"/>
		<updated>2024-01-11T18:34:02Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Un război se apropie, va trebui să ajuți combatanții să afle șansele lor de victorie.&lt;br /&gt;
&lt;br /&gt;
Se dă un vector cu n numere naturale, unde v[i] reprezintă numărul de valori egale cu i. Un scenariu în care omenirea câștigă e un scenariu în care suma numerelor dintr-o submulțime este multiplu de n.&lt;br /&gt;
&lt;br /&gt;
De exemplu, dacă vectorul din enunț este 1 2 3, valorile pe care le avem de fapt sunt 1 2 2 3 3 3, valori pe care le putem nota ca facând parte dintr-un nou vector, vectorul a, iar numărul de valori pe care îl avem este egal cu x = v[1]+v[2]+...+v[n].&lt;br /&gt;
&lt;br /&gt;
Astfel, trebuie să aflați câte din cele 2x&lt;br /&gt;
 submulțimi ale vectorului a au suma multiplu de n, modulo 109+7&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații, unde v[i] reprezintă numărul de valori egale cu i.&lt;br /&gt;
&lt;br /&gt;
=Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran răspunsul cerut.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 100&lt;br /&gt;
cele n numere citite vor fi mai mici decât 200000&lt;br /&gt;
Pentru 20 de puncte, suma numerelor din vector nu va depăși 20.&lt;br /&gt;
Pentru 60 de puncte, suma numerelor din vector nu va depăși 100000.&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
1 1 1&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
4&lt;br /&gt;
==Exemplu== 2&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
5&lt;br /&gt;
69 420 1017 128 953&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
985611225&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 10**9 + 7&lt;br /&gt;
&lt;br /&gt;
def numar_submultimi(n, v):&lt;br /&gt;
&lt;br /&gt;
   # Inițializăm tabelul DP cu 0&lt;br /&gt;
   DP = [[0] * n for _ in range(2)]&lt;br /&gt;
   # Setăm valoarea inițială pentru submulțimile vide&lt;br /&gt;
   DP[0][0] = 1&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       # Trecem la o nouă matrice DP (pară/impară)&lt;br /&gt;
       current = i % 2&lt;br /&gt;
       previous = 1 - current&lt;br /&gt;
       for j in range(n):&lt;br /&gt;
           # Copiem valorile din matricea anterioară&lt;br /&gt;
           DP[current][j] = DP[previous][j]&lt;br /&gt;
           # Actualizăm matricea curentă adăugând valorile corespunzătoare din vector&lt;br /&gt;
           DP[current][(j + i) % n] = (DP[current][(j + i) % n] + DP[previous][j]) % MOD&lt;br /&gt;
   return DP[n % 2][0] - 1&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n = int(input())&lt;br /&gt;
   v = list(map(int, input().split()))&lt;br /&gt;
   # Calculăm rezultatul și afișăm rezultatul&lt;br /&gt;
   rezultat = numar_submultimi(n, v)&lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3240_-_Sequences&amp;diff=9442</id>
		<title>3240 - Sequences</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3240_-_Sequences&amp;diff=9442"/>
		<updated>2024-01-11T18:33:28Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Să se calculeze numărul de șiruri crescătoare de lungime n, cu numere de la 1 la m, în care fiecare element apare de cel mult k ori.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
De la intrarea standard se citesc numerele întregi n, m și k, separate prin spațiu.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
La ieșirea standard programul va afișa numărul de șiruri descrise în enunț.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
0 &amp;lt; n &amp;lt; 31&lt;br /&gt;
0 &amp;lt; m &amp;lt; 31&lt;br /&gt;
0 &amp;lt; k &amp;lt; 31&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
3 4 2&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
16&lt;br /&gt;
==Explicație==&lt;br /&gt;
Explicație. Șirurile sunt: (1,1,2), (1,1,3), (1,1,4), (1,2,2), (1,2,3), (1,2,4), (1,3,3), (1,3,4), (1,4,4), (2,2,3), (2,2,4), (2,3,3), (2,3,4), (2,4,4), (3,3,4), (3,4,4).&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def numar_siruri(n, m, k):&lt;br /&gt;
&lt;br /&gt;
   # Funcție auxiliară pentru calculul coeficientului binomial&lt;br /&gt;
   def comb(n, r):&lt;br /&gt;
       result = 1&lt;br /&gt;
       for i in range(r):&lt;br /&gt;
           result = (result * (n - i)) // (i + 1)&lt;br /&gt;
       return result&lt;br /&gt;
   # Funcție recursivă pentru generarea numărului de șiruri&lt;br /&gt;
   def count_sequences(current_element, current_count, current_index):&lt;br /&gt;
       if current_index == n:&lt;br /&gt;
           return 1&lt;br /&gt;
       total_sequences = 0&lt;br /&gt;
       for i in range(current_element, m + 1):&lt;br /&gt;
           if current_count + 1 &amp;lt;= k:&lt;br /&gt;
               total_sequences += count_sequences(i, current_count + 1, current_index + 1)&lt;br /&gt;
       total_sequences += count_sequences(current_element, 0, current_index + 1)&lt;br /&gt;
       return total_sequences&lt;br /&gt;
   return count_sequences(1, 0, 0)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n, m, k = map(int, input().split())&lt;br /&gt;
   # Calculăm rezultatul și afișăm rezultatul&lt;br /&gt;
   rezultat = numar_siruri(n, m, k)&lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3821_-_Magic_Digits&amp;diff=9441</id>
		<title>3821 - Magic Digits</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3821_-_Magic_Digits&amp;diff=9441"/>
		<updated>2024-01-11T18:32:59Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Le Quack , mare fan al Lord Of The Rings , dar și al vrăjitoriei , află de la Gandalf că cifrele magice sunt { 1,2,3,4,5,6,7,8,9 } , cifra 0 este prea asemănătoare cu ochiul lui Sauron , fiind astfel considerată malefica. Le Quack iubeste aceste cifre magice încât le-a studiat mai atent și a observat că acestea pot forma numere de diferite lungimi ( ex : 1124 , 312 , 91235 ). Pentru fiecare număr format cu cifre magice definim gradul de frumusete ca fiind suma dintre frecvența minima a unei cifre magice și frecvența maxima a unei cifre magice care se găsește în număr. Formal , dacă construim un vector f , unde f[i] este numărul de apariții ale cifrei i și se șterg toate valorile pentru care f[i] = 0 , atunci min(f) + max(f) = k , unde k este gradul de frumusețe al numărului. De exemplu , pentru numărul 131 gradul de frumusețe este 1+2 = 3. Le Quack își pune următoarea întrebare : Câte numere de n cifre au gradul de frumusețe egal cu k ?&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură pe prima linie un număr N reprezentând lungimea numerelor care trebuie numărate și k , gradul de frumusețe al lor.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul cerut modulo 666013.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
N &amp;lt;= 300.&lt;br /&gt;
K &amp;lt;= 2*N.&lt;br /&gt;
Pentru 10 puncte N &amp;lt;= 6.&lt;br /&gt;
Pentru alte 10 puncte , K &amp;gt; N.&lt;br /&gt;
Pentru restul de 80 de puncte , K &amp;lt;= N , N &amp;gt; 6 si N &amp;lt;= 300.&lt;br /&gt;
Nu uitați că cifra 0 nu poate fi folosită !&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
2 2&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
72&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
3 2&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
504&lt;br /&gt;
==Explicație==&lt;br /&gt;
În primul exemplu , sunt 72 de numere de lungime 2 cu gradul de frumusețe 2. câteva dintre acestea&lt;br /&gt;
sunt : 13 , 14 , 32.&lt;br /&gt;
În al doilea exemplu sunt 504 numere de lungime 3 cu gradul de frumusețe 2. Câteva dintre acestea&lt;br /&gt;
sunt : 132 , 152 , 512.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 666013&lt;br /&gt;
&lt;br /&gt;
def numere_grad_frumusete(N, k):&lt;br /&gt;
&lt;br /&gt;
   # Funcție auxiliară pentru calculul coeficientului binomial&lt;br /&gt;
   def comb(n, r):&lt;br /&gt;
       result = 1&lt;br /&gt;
       for i in range(r):&lt;br /&gt;
           result = (result * (n - i)) % MOD&lt;br /&gt;
           result = (result * pow(i + 1, MOD - 2, MOD)) % MOD&lt;br /&gt;
       return result&lt;br /&gt;
   # Funcție recursivă pentru generarea numărului de aranjamente&lt;br /&gt;
   def count_arrangements(digit_counts, current_k):&lt;br /&gt;
       if current_k &amp;lt; 0:&lt;br /&gt;
           return 0&lt;br /&gt;
       if current_k == 0:&lt;br /&gt;
           # Calculăm numărul de moduri în care putem aranja cifrele&lt;br /&gt;
           result = 1&lt;br /&gt;
           for count in digit_counts:&lt;br /&gt;
               result = (result * comb(N, count)) % MOD&lt;br /&gt;
           return result&lt;br /&gt;
       total_arrangements = 0&lt;br /&gt;
       for i in range(1, 10):&lt;br /&gt;
           # Adăugăm cifra i și continuăm recursiv&lt;br /&gt;
           new_digit_counts = digit_counts[:]&lt;br /&gt;
           new_digit_counts.append(i)&lt;br /&gt;
           total_arrangements = (total_arrangements + count_arrangements(new_digit_counts, current_k - 1)) % MOD&lt;br /&gt;
       return total_arrangements&lt;br /&gt;
   return count_arrangements([], k)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   N, k = map(int, input().split())&lt;br /&gt;
   # Calculăm rezultatul și afișăm rezultatul modulo MOD&lt;br /&gt;
   rezultat = numere_grad_frumusete(N, k)&lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3571_-_Tango&amp;diff=9440</id>
		<title>3571 - Tango</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3571_-_Tango&amp;diff=9440"/>
		<updated>2024-01-11T18:32:20Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un tango este format din fraze muzicale, fiecare dintre acestea având 8 timpi muzicali. Timpii muzicali au aceeaşi durată. La fel de importantă ca melodia unui tango este şi dansul asociat ei. Mişcările efectuate în timpul dansului se numesc figuri. Succesiunea de figuri efectuate în timpul dansului formează o coregrafie. Două coregrafii se consideră diferite dacă succesiunea figurilor care le alcătuiesc este diferită. O coregrafie frumoasă asociată unui tango are particularitatea următoare: atunci când se termină o frază muzicală trebuie să se termine şi o figură.&lt;br /&gt;
&lt;br /&gt;
D şi S se pregătesc pentru primul lor concurs de dans şi ei lucreaza momentan la coregrafia de tango. Chiar dacă va fi primul lor concurs, ei deja ştiu n figuri de dans şi au calculat pentru fiecare dintre aceste figuri câţi timpi muzicali durează. Fiindcă le place foarte mult să danseze împreună, ei vor să pregătească o coregrafie frumoasă pentru o piesă care durează exact k timpi muzicali.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Determinaţi numărul coregrafiilor frumoase modulo 999983 pentru o piesă, care: durează exact k timpi muzicali, respectă condiţiile de mai sus şi sunt formate doar din cele n figuri cunoscute de D şi S (mai este prea puţin timp până la concurs, ca ei să inveţe şi figuri noi).&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Pe prima linie a fişierului de intrare tango.in se află numerele naturale nenule n şi k, separate printr-un singur spaţiu. Pe a doua linie se află exact n numere separate prin câte un spaţiu, reprezintând lungimile figurilor.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
În fişierul de ieşire tango.out se va afişa numărul de coregrafii posibile modulo 999983.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
n ≤ 100 000.&lt;br /&gt;
k ≤ 2 000 000 000.&lt;br /&gt;
k va fi întotdeauna divizibil cu 8.&lt;br /&gt;
1 ≤ lungimea unei figuri ≤ 8.&lt;br /&gt;
Pentru 30% din teste va exista o singură figură de o anumită lungime.&lt;br /&gt;
Pentru 50% din teste n ≤ 30.&lt;br /&gt;
Pentru 70% din teste lungimile figurilor vor fi numai valori din mulţimea {2, 4, 6, 8}.&lt;br /&gt;
Prin a modulo b se înţelege restul împărţirii lui a la b.&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
tango.in&lt;br /&gt;
&lt;br /&gt;
3 16&lt;br /&gt;
1 1 8&lt;br /&gt;
tango.out&lt;br /&gt;
&lt;br /&gt;
66049&lt;br /&gt;
==Explicație==&lt;br /&gt;
Sunt 16 timpi muzicali deci o coregrafie frumoasă se va dansa pe 16 / 8 = 2 fraze muzicale.&lt;br /&gt;
Dacă notăm figurile cu litere, avem figura A de lungime 1, figura B de lungime 1 şi figura C de lungime 8. Prima frază muzicală poate fi alcătuită din orice secvenţă alcătuită din opt bucăţi de A sau B, deci în total 2^8 = 256 posibilităţi. Încă o posibilitate de alcătuire a primei fraze este printr-un singur C. Rezultă un total de 257 posibilităţi. Pentru a doua frază avem tot atâtea posibilităţi, deci în total există 257 * 257 = 66049 coregrafii frumoase posibile.&lt;br /&gt;
Cum 66049 modulo 999983 = 66049, se obţine rezultatul 66049.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 999983&lt;br /&gt;
&lt;br /&gt;
def numar_coregrafii(n, k, lungimi_figuri):&lt;br /&gt;
&lt;br /&gt;
   # Inițializăm lista dp cu 0-uri&lt;br /&gt;
   dp = [0] * (k + 1)&lt;br /&gt;
   # Există o singură modalitate de a avea coregrafia de lungime 0&lt;br /&gt;
   dp[0] = 1&lt;br /&gt;
   # Calculăm numărul de coregrafii&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       for j in range(lungimi_figuri[i - 1], k + 1):&lt;br /&gt;
           dp[j] = (dp[j] + dp[j - lungimi_figuri[i - 1]]) % MOD&lt;br /&gt;
   return dp[k]&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   with open(&amp;quot;tango.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       n, k = map(int, f.readline().split())&lt;br /&gt;
       lungimi_figuri = list(map(int, f.readline().split()))&lt;br /&gt;
   rezultat = numar_coregrafii(n, k, lungimi_figuri)&lt;br /&gt;
   with open(&amp;quot;tango.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       g.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3234_-_Pavare_3&amp;diff=9439</id>
		<title>3234 - Pavare 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3234_-_Pavare_3&amp;diff=9439"/>
		<updated>2024-01-11T18:31:33Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Se dă un dreptunghi cu lungimea egală cu 2N centimetri și lățimea egală cu 3 centimetri.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Să se determine numărul M al pavărilor distincte cu dale dreptunghiulare care au lungimea egală cu un centimetru și lățimea egală cu 2 centimetri.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare pavare.in conține pe prima linie numărul natural nenul N, reprezentând jumătatea lungimii dreptunghiului.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire pavare.out va conține pe prima linie numărul natural nenul, reprezentând numărul modalităților de a pava dreptunghiul.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 100&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
pavare.in&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
pavare.out&lt;br /&gt;
&lt;br /&gt;
11&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1000000007&lt;br /&gt;
&lt;br /&gt;
def numar_pavari(N):&lt;br /&gt;
&lt;br /&gt;
   # Inițializăm lista dp cu 0-uri&lt;br /&gt;
   dp = [0] * (N + 1)&lt;br /&gt;
   # Prima poziție este 1, deoarece există o singură modalitate de a avea dreptunghiul nefragmentat&lt;br /&gt;
   dp[0] = 1&lt;br /&gt;
   # Calculăm numărul de modalități&lt;br /&gt;
   for i in range(1, N + 1):&lt;br /&gt;
       dp[i] = (3 * dp[i - 1]) % MOD&lt;br /&gt;
       if i &amp;gt;= 2:&lt;br /&gt;
           dp[i] = (dp[i] + dp[i - 2]) % MOD&lt;br /&gt;
   return dp[N]&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   with open(&amp;quot;pavare.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       N = int(f.readline())&lt;br /&gt;
   rezultat = numar_pavari(N)&lt;br /&gt;
   with open(&amp;quot;pavare.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       g.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0730_-_Minus_K&amp;diff=9438</id>
		<title>0730 - Minus K</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0730_-_Minus_K&amp;diff=9438"/>
		<updated>2024-01-11T18:30:51Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dau două numere naturale N şi K. Determinaţi numărul de şiruri de lungime N formate doar din semnele + şi – şi în care nu apar K semne – pe poziţii consecutive.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare minusk.in conţine pe prima linie 2 numere naturale separate printr-un spaţiu, N şi K, cu semnificaţia din enunţ.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire minusk.out va conține pe prima linie un singur număr natural reprezentând valoarea cerută, modulo 2011.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ K ≤ N ≤ 1000000;&lt;br /&gt;
pentru 30% dintre teste N ≤ 10&lt;br /&gt;
pentru 70% dintre teste N ≤ 1000&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
minusk.in&lt;br /&gt;
&lt;br /&gt;
4 2&lt;br /&gt;
minusk.out&lt;br /&gt;
&lt;br /&gt;
8&lt;br /&gt;
==Explicație==&lt;br /&gt;
Cele 8 şiruri sunt: ++++, +++-, ++-+, +-++, -+++, +-+-, -++-, -+-+. În niciunul dintre aceste şiruri nu avem două sau mai mult de două caractere – pe poziţii consecutive.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 2011&lt;br /&gt;
&lt;br /&gt;
def numar_siruri(N, K):&lt;br /&gt;
&lt;br /&gt;
   # Inițializăm matricea dp cu 0-uri&lt;br /&gt;
   dp = [[0] * 2 for _ in range(N + 1)]&lt;br /&gt;
   # Prima coloană este 1, pentru că există un singur șir de lungime 0, și anume șirul vid&lt;br /&gt;
   dp[0][0] = 1&lt;br /&gt;
   # Calculăm numărul de șiruri&lt;br /&gt;
   for i in range(1, N + 1):&lt;br /&gt;
       # Dacă adăugăm + în șirul anterior, nu adăugăm un semn - pe poziția i&lt;br /&gt;
       dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) % MOD&lt;br /&gt;
       # Dacă adăugăm - în șirul anterior, verificăm dacă am adăugat deja K semne - consecutive&lt;br /&gt;
       if i &amp;gt;= K:&lt;br /&gt;
           dp[i][1] = (dp[i - 1][0] - dp[i - K][1] + MOD) % MOD&lt;br /&gt;
       else:&lt;br /&gt;
           dp[i][1] = dp[i - 1][0]&lt;br /&gt;
   return (dp[N][0] + dp[N][1]) % MOD&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   with open(&amp;quot;minusk.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       N, K = map(int, f.readline().split())&lt;br /&gt;
   rezultat = numar_siruri(N, K)&lt;br /&gt;
   with open(&amp;quot;minusk.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       g.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4032_-_Zar_1&amp;diff=9437</id>
		<title>4032 - Zar 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4032_-_Zar_1&amp;diff=9437"/>
		<updated>2024-01-11T18:29:56Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
În câte moduri se poate obține suma n aruncând cu zarul (În câte moduri poți să îl scrii pe n ca sumă de valori mai mici sau egale cu 6).&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran răspunsul la întrebarea din enunț.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1≤n≤1018&lt;br /&gt;
Rezultatul se va afișa modulo 109+7&lt;br /&gt;
.&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
8&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
125&lt;br /&gt;
==Explicație==&lt;br /&gt;
Câteva dintre posibilități ar fi 1 + 1 + 6, 2 + 5 + 1, 1 + 6 + 1 …&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 10**9 + 7&lt;br /&gt;
&lt;br /&gt;
def numar_moduri_suma(n):&lt;br /&gt;
&lt;br /&gt;
   # Initializăm lista cu 0-uri&lt;br /&gt;
   dp = [0] * (n + 1)&lt;br /&gt;
   # Există o singură modalitate de a obține suma 0, adică nu aruncăm zarul&lt;br /&gt;
   dp[0] = 1&lt;br /&gt;
   # Calculăm numărul de moduri pentru fiecare sumă posibilă&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       for j in range(1, 7):&lt;br /&gt;
           if i - j &amp;gt;= 0:&lt;br /&gt;
               dp[i] = (dp[i] + dp[i - j]) % MOD&lt;br /&gt;
   return dp[n]&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   n = int(input(&amp;quot;Introduceți suma n: &amp;quot;))&lt;br /&gt;
   rezultat = numar_moduri_suma(n)&lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3084_-_Cub_Dinamic&amp;diff=9436</id>
		<title>3084 - Cub Dinamic</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3084_-_Cub_Dinamic&amp;diff=9436"/>
		<updated>2024-01-11T18:29:14Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un tablou tridimensional, de dimensiune n&lt;br /&gt;
 x n&lt;br /&gt;
 x n&lt;br /&gt;
, fiecare element reprezentând o camera. m&lt;br /&gt;
 dintre acestea sunt blocate și nu pot fi traversate. Dintr-o cameră având coordonatele (i,j,k)&lt;br /&gt;
 te poți deplasa in camerele de coordonate (i+1,j,k)&lt;br /&gt;
, (i,j+1,k)&lt;br /&gt;
 și (i,j,k+1)&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
Știind că pornești din camera cu coordonate (1,1,1)&lt;br /&gt;
, se cere să se afișeze numărul de moduri modulo 1234567&lt;br /&gt;
 de a ajunge in camera de coordonate (n,n,n,)&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare cub_dinamic.in conține pe prima linie numerele n și m, iar pe următoarele m linii câte 3 numere reprezentând coordonatele camerelor blocate.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire cub_dinamic.out va conține pe prima linie numărul S, reprezentând numărul de moduri modulo 1234567&lt;br /&gt;
 de a ajunge din camera (1,1,1)&lt;br /&gt;
 în camera (n,n,n)&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 200&lt;br /&gt;
1 ≤ coordonatele camerelor ≤ n&lt;br /&gt;
0 ≤ m ≤ n*n*n&lt;br /&gt;
Dacă nu se poate ajunge in camera (n,n,n)&lt;br /&gt;
 sau una dintre camerele (1,1,1)&lt;br /&gt;
 sau (n,n,n)&lt;br /&gt;
 este blocată, atunci se va afișa 0.&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
cub_dinamic.in&lt;br /&gt;
&lt;br /&gt;
3 1&lt;br /&gt;
2 2 2&lt;br /&gt;
cub_dinamic.out&lt;br /&gt;
&lt;br /&gt;
54&lt;br /&gt;
==Explicație==&lt;br /&gt;
Există 54 de moduri de a ajunge din camera (1,1,1)&lt;br /&gt;
 în camera (n,n,n)&lt;br /&gt;
 fără a trece prin camere blocate.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 1234567&lt;br /&gt;
&lt;br /&gt;
def numar_moduri(n, m, camere_blocate):&lt;br /&gt;
&lt;br /&gt;
   dp = [[[0] * (n + 1) for _ in range(n + 1)] for _ in range(n + 1)]&lt;br /&gt;
   # Inițializăm matricea cu 0-uri&lt;br /&gt;
   for i in range(n + 1):&lt;br /&gt;
       for j in range(n + 1):&lt;br /&gt;
           for k in range(n + 1):&lt;br /&gt;
               dp[i][j][k] = 0&lt;br /&gt;
   # Marcam camerele blocate cu -1&lt;br /&gt;
   for i, j, k in camere_blocate:&lt;br /&gt;
       dp[i][j][k] = -1&lt;br /&gt;
   # Dacă camera finală este blocată sau camera de plecare este blocată, returnăm 0&lt;br /&gt;
   if dp[1][1][1] == -1 or dp[n][n][n] == -1:&lt;br /&gt;
       return 0&lt;br /&gt;
   dp[1][1][1] = 1&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       for j in range(1, n + 1):&lt;br /&gt;
           for k in range(1, n + 1):&lt;br /&gt;
               # Dacă camera este blocată, continuăm&lt;br /&gt;
               if dp[i][j][k] == -1:&lt;br /&gt;
                   continue&lt;br /&gt;
               # Actualizăm modul în care putem ajunge în camerele adiacente&lt;br /&gt;
               if i + 1 &amp;lt;= n and dp[i + 1][j][k] != -1:&lt;br /&gt;
                   dp[i + 1][j][k] = (dp[i + 1][j][k] + dp[i][j][k]) % MOD&lt;br /&gt;
               if j + 1 &amp;lt;= n and dp[i][j + 1][k] != -1:&lt;br /&gt;
                   dp[i][j + 1][k] = (dp[i][j + 1][k] + dp[i][j][k]) % MOD&lt;br /&gt;
               if k + 1 &amp;lt;= n and dp[i][j][k + 1] != -1:&lt;br /&gt;
                   dp[i][j][k + 1] = (dp[i][j][k + 1] + dp[i][j][k]) % MOD&lt;br /&gt;
   return dp[n][n][n]&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   with open(&amp;quot;cub_dinamic.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       n, m = map(int, f.readline().split())&lt;br /&gt;
       camere_blocate = [tuple(map(int, f.readline().split())) for _ in range(m)]&lt;br /&gt;
   rezultat = numar_moduri(n, m, camere_blocate)&lt;br /&gt;
   with open(&amp;quot;cub_dinamic.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       g.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2532_-_Cnt_Cif_Sum&amp;diff=9435</id>
		<title>2532 - Cnt Cif Sum</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2532_-_Cnt_Cif_Sum&amp;diff=9435"/>
		<updated>2024-01-11T18:28:23Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un număr N și un număr S. Să se determine câte numere de N cifre au suma cifrelor S.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele N și S.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul C, reprezentând numărul de numere de N cifre având suma cifrelor S modulo 666013.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ N ≤ 1000&lt;br /&gt;
1 ≤ S ≤ 9 * N&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
2 3&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 666013&lt;br /&gt;
&lt;br /&gt;
def numere_suma(N, S):&lt;br /&gt;
&lt;br /&gt;
   dp = [[0] * (S + 1) for _ in range(N + 1)]&lt;br /&gt;
   # Inițializăm prima coloană cu 1, deoarece există o singură modalitate de a obține suma 0&lt;br /&gt;
   for i in range(N + 1):&lt;br /&gt;
       dp[i][0] = 1&lt;br /&gt;
   # Calculăm numărul de moduri&lt;br /&gt;
   for i in range(1, N + 1):&lt;br /&gt;
       for j in range(1, S + 1):&lt;br /&gt;
           for k in range(10):&lt;br /&gt;
               if j - k &amp;gt;= 0:&lt;br /&gt;
                   dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % MOD&lt;br /&gt;
   return dp[N][S]&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   N, S = map(int, input(&amp;quot;Introduceți N și S separate prin spațiu: &amp;quot;).split())&lt;br /&gt;
   &lt;br /&gt;
   rezultat = numere_suma(N, S)&lt;br /&gt;
   &lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1824_-_Pitic&amp;diff=9434</id>
		<title>1824 - Pitic</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1824_-_Pitic&amp;diff=9434"/>
		<updated>2024-01-11T18:27:56Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Enunt==&lt;br /&gt;
Carmen, piticul de gradina vrea sa meargă în vizita la piticul Tulosba. Pentru a ajunge la Tulosba, Carmen trebuie sa meargă printr-o rețea de N galerii, fiecare alcătuită din M sectoare.&lt;br /&gt;
&lt;br /&gt;
Rețeaua poate fi reprezentată printr-un tablou cu N linii, numerotate de la 1 la N și M coloane, numerotate de la 1 la M . Carmen ocupă sectorul 1 al galeriei 1. Tulosba ocupă sectorul M al galeriei 1.&lt;br /&gt;
La galeria n se termina rețeaua și începe gradina unde sunt niște copii răi care vor sa-l spargă pe Carmen cu bâtele de Baseball.&lt;br /&gt;
&lt;br /&gt;
Dacă sectorul curent a lui Carmen este (i,j), atunci se poate deplasa:&lt;br /&gt;
&lt;br /&gt;
La dreapta, ajungând în sectorul (i,j+1) .&lt;br /&gt;
Pe diagonala la dreapta în sus, ajungând în sectorul (i-1,j+1).&lt;br /&gt;
Pe diagonala la dreapta în jos, ajungând în sectorul (i+1,j+1).&lt;br /&gt;
Cerința&lt;br /&gt;
Sa se afișeze în câte moduri poate Carmen sa ajungă la Tulosba.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare pitic.in conține pe prima linie numerele n și m cu semnificația din problema.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire pitic.out va conține pe prima linie numărul S, reprezentând în câte moduri poate sa ajungă Carmen la Tulosba.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
Carmen nu poate sa coboare sub nivelul 1&lt;br /&gt;
Carmen nu poate sa urce mai sus de nivelul n pentru ca o sa fie spart de copii&lt;br /&gt;
1 ≤ n ≤ 43&lt;br /&gt;
1 ≤ m ≤ 43&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
pitic.in&lt;br /&gt;
&lt;br /&gt;
3 3&lt;br /&gt;
pitic.out&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
pitic.in&lt;br /&gt;
&lt;br /&gt;
7 1&lt;br /&gt;
pitic.out&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
pitic.in&lt;br /&gt;
&lt;br /&gt;
4 4&lt;br /&gt;
pitic.out&lt;br /&gt;
&lt;br /&gt;
4&lt;br /&gt;
==Explicație==&lt;br /&gt;
Exemplul 1 : Piticul Carmen poate sa meargă de 2 ori la dreapta sau o dată pe diagonala în sus la dreapta și odată pe diagonala în jos la dreapta.&lt;br /&gt;
&lt;br /&gt;
Exemplul 2 : Piticul Carmen poate sa meargă doar la dreapta deoarece dacă urca pe nivelul 2 o sa ajungă în gradina.&lt;br /&gt;
&lt;br /&gt;
Exemplul 3 :&lt;br /&gt;
Modul 1: Dreapta de 3 ori&lt;br /&gt;
Modul 2: Diagonala sus, Diagonala jos, Dreapta&lt;br /&gt;
Modul 3: Diagonala sus, Dreapta , Diagonala jos&lt;br /&gt;
Modul 4: Dreapta, Diagonala sus, Diagonala jos&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def numar_moduri(n, m):&lt;br /&gt;
&lt;br /&gt;
   dp = [[0] * (m + 1) for _ in range(n + 1)]&lt;br /&gt;
   # Inițializăm prima coloană cu 1, deoarece Carmen poate să ajungă în oricare dintre cele n niveluri pornind de la nivelul 1&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       dp[i][1] = 1&lt;br /&gt;
   # Calculăm numărul total de moduri&lt;br /&gt;
   for j in range(2, m + 1):&lt;br /&gt;
       for i in range(1, n + 1):&lt;br /&gt;
           dp[i][j] = dp[i][j - 1]  # Carmen merge la dreapta&lt;br /&gt;
           if i - 1 &amp;gt; 0:&lt;br /&gt;
               dp[i][j] += dp[i - 1][j - 1]  # Carmen merge pe diagonala sus&lt;br /&gt;
           if i + 1 &amp;lt;= n:&lt;br /&gt;
               dp[i][j] += dp[i + 1][j - 1]  # Carmen merge pe diagonala jos&lt;br /&gt;
   return sum(dp[i][m] for i in range(1, n + 1))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   with open(&amp;quot;pitic.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       n, m = map(int, f.readline().split())&lt;br /&gt;
   rezultat = numar_moduri(n, m)&lt;br /&gt;
   with open(&amp;quot;pitic.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       g.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3214_-_Dinamica_04&amp;diff=9433</id>
		<title>3214 - Dinamica 04</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3214_-_Dinamica_04&amp;diff=9433"/>
		<updated>2024-01-11T18:27:32Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Definim un număr natural ca fiind bun dacă toate cifrele impare se află înaintea celor pare. De exemplu, numerele 13424, 400, 1357 sunt bune, pe când 34010 nu este.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Dându-se un număr natural nenul n, să se determine câte numere bune de n cifre există. Pentru că acest număr poate fi foarte mare, se va determina răspunsul modulo 123457.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul de numere bune de n cifre, modulo 123457.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
Pentru 70% din punctaj, 1 ≤ n ≤ 100.000&lt;br /&gt;
Pentru 30% din punctaj, 100.001 ≤ n ≤ 1.000.000.000&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
475&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 123457&lt;br /&gt;
&lt;br /&gt;
def numere_bune(n):&lt;br /&gt;
&lt;br /&gt;
   # Inițializăm matricea dp cu 0-uri&lt;br /&gt;
   dp = [[0] * 2 for _ in range(n + 1)]&lt;br /&gt;
   # Pentru un singur caracter, avem 5 opțiuni (cifrele impare)&lt;br /&gt;
   dp[1][0] = 5&lt;br /&gt;
   dp[1][1] = 0&lt;br /&gt;
   # Calculăm numărul de numere bune pentru n caractere&lt;br /&gt;
   for i in range(2, n + 1):&lt;br /&gt;
       dp[i][0] = (dp[i - 1][0] * 5 + dp[i - 1][1] * 5) % MOD&lt;br /&gt;
       dp[i][1] = dp[i - 1][0]&lt;br /&gt;
   return (dp[n][0] + dp[n][1]) % MOD&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   n = int(input(&amp;quot;Introduceți n: &amp;quot;))&lt;br /&gt;
   &lt;br /&gt;
   rezultat = numere_bune(n)&lt;br /&gt;
   &lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2260_-_Dinamica_02&amp;diff=9432</id>
		<title>2260 - Dinamica 02</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2260_-_Dinamica_02&amp;diff=9432"/>
		<updated>2024-01-11T18:27:06Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră un număr natural nenul N.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Să se determine numărul de cuvinte de lungime N formate doar din litere mici și cu proprietatea că nu pot exista trei litere alăturate identice. Pentru că acest număr poate fi foarte mare, se va determina modulo 777013.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul N.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul de cuvinte modulo 777013.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ N ≤ 1 000 000&lt;br /&gt;
Cuvintele baaad și deeeeef au trei litere alăturate egale, pe când abbaa și xxyyxx nu au.&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
676&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 777013&lt;br /&gt;
&lt;br /&gt;
def numar_cuvinte(N):&lt;br /&gt;
&lt;br /&gt;
   # Inițializăm matricea dp cu 0-uri&lt;br /&gt;
   dp = [[0] * 2 for _ in range(N + 1)]&lt;br /&gt;
   # Pentru un singur caracter, avem 26 opțiuni (literele mici de la &#039;a&#039; la &#039;z&#039;)&lt;br /&gt;
   dp[1][0] = 26&lt;br /&gt;
   dp[1][1] = 0&lt;br /&gt;
   # Calculăm numărul de cuvinte pentru N caractere&lt;br /&gt;
   for i in range(2, N + 1):&lt;br /&gt;
       dp[i][0] = (dp[i - 1][0] * 25 + dp[i - 1][1]) % MOD&lt;br /&gt;
       dp[i][1] = dp[i - 1][0]&lt;br /&gt;
   return (dp[N][0] + dp[N][1]) % MOD&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   N = int(input(&amp;quot;Introduceți N: &amp;quot;))&lt;br /&gt;
   &lt;br /&gt;
   rezultat = numar_cuvinte(N)&lt;br /&gt;
   &lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2259_-_Dinamica_01&amp;diff=9431</id>
		<title>2259 - Dinamica 01</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2259_-_Dinamica_01&amp;diff=9431"/>
		<updated>2024-01-11T18:26:42Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră un număr natural nenul N. Vom considera mulțimea A(N) a numerelor de N cifre nenule care au proprietatea că orice două cifre alăturate sunt de parități diferite. De exemplu 1472 este un număr din mulțimea A(4), dar 1567 nu este pentru că are cifrele alăturate 1 și 5 de aceeași paritate.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Să se determine numărul de elemente ale mulțimii A(N). Pentru că acest număr poate fi foarte mare, se va determina modulo 30103.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul N.&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul S, reprezentând numărul modulo 30103 al elementelor mulțimii A(N).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 100.000&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
Ieșire&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 30103&lt;br /&gt;
&lt;br /&gt;
def numar_elemente_multime(N):&lt;br /&gt;
&lt;br /&gt;
   # Inițializăm matricea dp cu 0-uri&lt;br /&gt;
   dp = [[0] * 2 for _ in range(N + 1)]&lt;br /&gt;
   # Pentru un singur caracter, avem 9 opțiuni (de la 1 la 9)&lt;br /&gt;
   dp[1][0] = 9&lt;br /&gt;
   dp[1][1] = 0&lt;br /&gt;
   # Calculăm numărul de elemente pentru N cifre&lt;br /&gt;
   for i in range(2, N + 1):&lt;br /&gt;
       dp[i][0] = (dp[i - 1][0] * 9 + dp[i - 1][1]) % MOD&lt;br /&gt;
       dp[i][1] = dp[i - 1][0]&lt;br /&gt;
   return (dp[N][0] + dp[N][1]) % MOD&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   N = int(input(&amp;quot;Introduceți N: &amp;quot;))&lt;br /&gt;
   &lt;br /&gt;
   rezultat = numar_elemente_multime(N)&lt;br /&gt;
   &lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2882_-_No_Pals&amp;diff=9430</id>
		<title>2882 - No Pals</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2882_-_No_Pals&amp;diff=9430"/>
		<updated>2024-01-11T18:26:16Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Gioni este un elev foarte pasionat de informatică și îndrăgește în special problemele care se rezolvă cu tehnica programării dinamice. El are un număr natural n și vrea să știe pentru fiecare numar i de la 1 la n câte numere cu i cifre nu sunt palindromuri. Fiindcă acest număr poate să fie foarte mare, se cere afișarea lui modulo 666013.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare no_pals.in conține pe prima linie numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire no_pals.out va conține pe fiecare linie i, de la 1 la n, numărul de numere de i cifre care nu sunt palindromuri.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 100000&lt;br /&gt;
Exemplu:&lt;br /&gt;
no_pals.in&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
no_pals.out&lt;br /&gt;
&lt;br /&gt;
0&lt;br /&gt;
81&lt;br /&gt;
810&lt;br /&gt;
==Explicație==&lt;br /&gt;
Toate numerele de o cifra sunt palindromuri. Sunt 90 de numere de 2 cifre, dintre care 9 sunt palindromuri. Sunt 900 de numere de 3 cifre, dintre care 90 sunt palindromuri.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 666013&lt;br /&gt;
&lt;br /&gt;
def numere_nepalindromice(n):&lt;br /&gt;
&lt;br /&gt;
   dp = [0] * (n + 1)&lt;br /&gt;
   dp[1] = 9  # Un singur caracter, 9 opțiuni ne-palindromice (de la 1 la 9)&lt;br /&gt;
   for i in range(2, n + 1):&lt;br /&gt;
       dp[i] = (dp[i - 1] * 9) % MOD  # Numărul de opțiuni pentru i cifre&lt;br /&gt;
   return dp&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   with open(&amp;quot;no_pals.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       n = int(f.readline().strip())&lt;br /&gt;
   rezultate = numere_nepalindromice(n)&lt;br /&gt;
   with open(&amp;quot;no_pals.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       for rezultat in rezultate[1:]:&lt;br /&gt;
           g.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2421_-_CalculSume&amp;diff=9429</id>
		<title>2421 - CalculSume</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2421_-_CalculSume&amp;diff=9429"/>
		<updated>2024-01-11T18:25:49Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Cu n numere naturale, a1,a2,…,an&lt;br /&gt;
, se pot calcula următoarele sume:&lt;br /&gt;
S1=a1+a2+…+an&lt;br /&gt;
&lt;br /&gt;
S2=a1⋅a2+a1⋅a3+…+an−1⋅an&lt;br /&gt;
&lt;br /&gt;
S3=a1⋅a2⋅a3+a1⋅a2⋅a4+…+an−2⋅an−1⋅an&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
Sn=a1⋅a2⋅…⋅an&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
Se dau două numere n&lt;br /&gt;
 și k&lt;br /&gt;
 și apoi n numere naturale a1,a2,…,an&lt;br /&gt;
. Se cere să se calculeze suma Sk&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare calculsume.in conține pe prima linie două numere n și k separate printr-un spațiu, urmate, pe a doua linie de n numere naturale separate de asemenea, prin spații.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire calculsume.out va conține rezultatul cerut.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ k ≤ n ≤ 100&lt;br /&gt;
numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 101&lt;br /&gt;
pentru că sumele cerute pot avea valori foarte mari, se cere să se afișeze restul împărțirii acestora la 9973&lt;br /&gt;
Exemplul 1:&lt;br /&gt;
calculsume.in&lt;br /&gt;
&lt;br /&gt;
3 1&lt;br /&gt;
1 2 3 &lt;br /&gt;
calculsume.out&lt;br /&gt;
&lt;br /&gt;
6&lt;br /&gt;
Exemplul 2:&lt;br /&gt;
calculsume.in&lt;br /&gt;
&lt;br /&gt;
3 2 &lt;br /&gt;
1 2 3&lt;br /&gt;
calculsume.out&lt;br /&gt;
&lt;br /&gt;
11&lt;br /&gt;
Exemplul 3:&lt;br /&gt;
calculsume.in&lt;br /&gt;
&lt;br /&gt;
3 3&lt;br /&gt;
1 2 3 &lt;br /&gt;
calculsume.out&lt;br /&gt;
&lt;br /&gt;
6&lt;br /&gt;
==Explicație==&lt;br /&gt;
Cele 3 exemple citesc câte un set de date de intrare, pentru fiecare se va afișa rezultatul cerut.&lt;br /&gt;
&lt;br /&gt;
S 1 = 1 + 2 + 3, deci suma S1 este 6&lt;br /&gt;
&lt;br /&gt;
S 2 =1*2+1*3+2*3, deci suma S2 este 11&lt;br /&gt;
&lt;br /&gt;
S 3 =1*2*3, deci suma S3 este 6.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 9973&lt;br /&gt;
&lt;br /&gt;
def calculeaza_suma_k(n, k, numere):&lt;br /&gt;
&lt;br /&gt;
   sume = [0] * (k + 1)&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       for j in range(k, 0, -1):&lt;br /&gt;
           sume[j] = (sume[j] + numere[i - 1] * sume[j - 1]) % MOD&lt;br /&gt;
   &lt;br /&gt;
   return sume[k]&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   with open(&amp;quot;calculsume.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       n, k = map(int, f.readline().split())&lt;br /&gt;
       numere = list(map(int, f.readline().split()))&lt;br /&gt;
   rezultat = calculeaza_suma_k(n, k, numere)&lt;br /&gt;
   with open(&amp;quot;calculsume.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       g.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3990_-_Dinamica_09&amp;diff=9428</id>
		<title>3990 - Dinamica 09</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3990_-_Dinamica_09&amp;diff=9428"/>
		<updated>2024-01-11T18:25:21Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un număr natural nenul n. Să se determine numărul de numere de n cifre din mulțimea {1, 2, 3, 4} care nu au două cifre alăturate egale și care au proprietatea că sunt divizibile cu 2. Pentru că acest număr poate fi foarte mare, se va calcula modulo 123457.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n,.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul cerut, modulo 123457.&lt;br /&gt;
&lt;br /&gt;
Restricții și precizări&lt;br /&gt;
Pentru 80 de puncte, 1 ≤ n ≤ 10.000&lt;br /&gt;
Pentru alte 20 de puncte, 100.000.000 ≤ n ≤ 1.000.000.000&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
6&lt;br /&gt;
==Explicație==&lt;br /&gt;
Numerele sunt 12, 14, 24, 32, 34, 42.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def count_numbers(n):&lt;br /&gt;
&lt;br /&gt;
   mod = 123457&lt;br /&gt;
   # Inițializare vector dp&lt;br /&gt;
   dp = [[0] * 4 for _ in range(n + 1)]&lt;br /&gt;
   for i in range(1, 4):&lt;br /&gt;
       dp[1][i] = 1&lt;br /&gt;
   # Calcul numărul de numere&lt;br /&gt;
   for i in range(2, n + 1):&lt;br /&gt;
       dp[i][1] = (dp[i - 1][2] + dp[i - 1][3]) % mod&lt;br /&gt;
       dp[i][2] = (dp[i - 1][1] + dp[i - 1][3]) % mod&lt;br /&gt;
       dp[i][3] = (dp[i - 1][1] + dp[i - 1][2]) % mod&lt;br /&gt;
   result = (dp[n][1] + dp[n][2] + dp[n][3]) % mod&lt;br /&gt;
   return result&lt;br /&gt;
Citire date de intrare&lt;br /&gt;
&lt;br /&gt;
n = int(input())&lt;br /&gt;
&lt;br /&gt;
Calcul și afișare rezultat&lt;br /&gt;
&lt;br /&gt;
result = count_numbers(n) print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3661_-_Dinamica_05&amp;diff=9427</id>
		<title>3661 - Dinamica 05</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3661_-_Dinamica_05&amp;diff=9427"/>
		<updated>2024-01-11T18:24:53Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dau numerele naturale n și p. Să se determine:&lt;br /&gt;
a) numărul cuvintelor de lungime n formate doar din litere mari și mici și cu proprietatea că aceste cuvinte nu pot avea două litere alăturate identice, indiferent că sunt mari sau mici (cuvintele baArda sau fEEric au două litere alăturate identice).&lt;br /&gt;
b) numărul cuvintelor de lungime n formate doar din litere mari și mici și cu proprietatea că nu pot apărea două litere mari pe poziții alăturate.&lt;br /&gt;
c) numărul cuvintelor de lungime n formate doar din litere mici și cu proprietatea că au cel mult p vocale (vocalele fiind: a, e, i, o, u)&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele n și p.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran trei numere: X, Y și Z, separate prin spațiu, care vor reprezenta răspunsurile la cele trei cerințe. Pentru că aceste numere pot fi foarte mari, se vor determina modulo 123457&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ p &amp;lt; n ≤ 1.000&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
2 1&lt;br /&gt;
Ieșire&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def count_words(n, p):&lt;br /&gt;
&lt;br /&gt;
   mod = 123457&lt;br /&gt;
   # a) Numărul cuvintelor fără două litere identice alăturate&lt;br /&gt;
   dp_a = [[0] * 2 for _ in range(n + 1)]&lt;br /&gt;
   dp_a[1][0] = 26  # o literă mică&lt;br /&gt;
   dp_a[1][1] = 26  # o literă mare&lt;br /&gt;
   for i in range(2, n + 1):&lt;br /&gt;
       dp_a[i][0] = (dp_a[i - 1][0] + dp_a[i - 1][1]) % mod&lt;br /&gt;
       dp_a[i][1] = dp_a[i - 1][0]&lt;br /&gt;
   X = (dp_a[n][0] + dp_a[n][1]) % mod&lt;br /&gt;
   # b) Numărul cuvintelor fără două litere mari consecutive&lt;br /&gt;
   dp_b = [0] * (n + 1)&lt;br /&gt;
   dp_b[1] = 52  # o literă mică sau mare&lt;br /&gt;
   for i in range(2, n + 1):&lt;br /&gt;
       dp_b[i] = dp_b[i - 1] * 2 - dp_b[i - 2]&lt;br /&gt;
   Y = dp_b[n]&lt;br /&gt;
   # c) Numărul cuvintelor mici cu cel mult p vocale&lt;br /&gt;
   dp_c = [[0] * (p + 1) for _ in range(n + 1)]&lt;br /&gt;
   dp_c[1][0] = 25  # o literă mică fără vocală&lt;br /&gt;
   for i in range(2, n + 1):&lt;br /&gt;
       dp_c[i][0] = (dp_c[i - 1][0] * 25) % mod&lt;br /&gt;
       for j in range(1, min(i, p) + 1):&lt;br /&gt;
           dp_c[i][j] = (dp_c[i - 1][j] * 25 + dp_c[i - 1][j - 1]) % mod&lt;br /&gt;
   Z = sum(dp_c[n][:p + 1]) % mod&lt;br /&gt;
   return X, Y, Z&lt;br /&gt;
Citire date de intrare&lt;br /&gt;
&lt;br /&gt;
n, p = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
Calcul și afișare rezultat&lt;br /&gt;
&lt;br /&gt;
result = count_words(n, p) print(*result)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2600 2028 651&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3217_-_Trepte_2.2&amp;diff=9426</id>
		<title>3217 - Trepte 2.2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3217_-_Trepte_2.2&amp;diff=9426"/>
		<updated>2024-01-11T18:24:27Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
O persoana are de urcat n trepte. Ştiind că de pe treapta i poate trece pe treapta i + 1, i + 2, ..., i + (k - 1) sau i + k, aflaţi în câte moduri poate urca cele n trepte. (inițial se afla treapta 1)&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele n și k.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul c, reprezentând numărul de moduri în care poate urca cele n trepte.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 &amp;lt; n ≤ 1.000.000;&lt;br /&gt;
1 ≤ k ≤ n - 1;&lt;br /&gt;
deoarece numărul va fi prea mare sa va afișa modulo 9001;&lt;br /&gt;
la început, persoana se află pe treapta 1.&lt;br /&gt;
==Exemplul 1==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
2 2&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
==Explicație==&lt;br /&gt;
Există o soluție, aceea când sare direct pe treapta 2.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
4 2&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
==Explicație==&lt;br /&gt;
Prima: 1 -&amp;gt; 2 -&amp;gt; 3 -&amp;gt; 4&lt;br /&gt;
A doua: 1 -&amp;gt; 2 -&amp;gt; 4&lt;br /&gt;
A treia: 1 -&amp;gt; 3 -&amp;gt; 4&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def numar_moduri_urcare_trepte(n, k):&lt;br /&gt;
&lt;br /&gt;
   mod = 9001&lt;br /&gt;
   # Inițializare vector dp&lt;br /&gt;
   dp = [0] * (n + 1)&lt;br /&gt;
   dp[1] = 1&lt;br /&gt;
   # Calcul numărul de moduri&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       for j in range(1, k + 1):&lt;br /&gt;
           if i + j &amp;lt;= n:&lt;br /&gt;
               dp[i + j] = (dp[i + j] + dp[i]) % mod&lt;br /&gt;
   return dp[n]&lt;br /&gt;
Citire date de intrare&lt;br /&gt;
&lt;br /&gt;
n, k = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
Calcul și afișare rezultat&lt;br /&gt;
&lt;br /&gt;
result = numar_moduri_urcare_trepte(n, k) print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1991_-_Trepte_2&amp;diff=9425</id>
		<title>1991 - Trepte 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1991_-_Trepte_2&amp;diff=9425"/>
		<updated>2024-01-11T18:23:55Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
O persoana are de urcat n trepte. Ştiind că de pe treapta i poate trece pe treapta i + 1, i + 2, ..., i + (k - 1) sau i + k, aflaţi în câte moduri poate urca cele n trepte. (inițial este pe treapta 1)&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele n și k.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul c, reprezentând numărul de moduri în care poate urca cele n trepte.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 &amp;lt; n ≤ 100.000&lt;br /&gt;
1 ≤ k ≤ n - 1&lt;br /&gt;
deoarece numărul va fi prea mare sa va afișa modulo 9001.&lt;br /&gt;
==Exemplul 1==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
2 2&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
Explicație&lt;br /&gt;
Există o soluție, aceea când sare direct pe treapta 2.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
4 2&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
==Explicație==&lt;br /&gt;
Prima: 1 -&amp;gt; 2 -&amp;gt; 3 -&amp;gt; 4&lt;br /&gt;
A doua: 1 -&amp;gt; 2 -&amp;gt; 4&lt;br /&gt;
A treia: 1 -&amp;gt; 3 -&amp;gt; 4&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def numar_moduri_urcare_trepte(n, k):&lt;br /&gt;
&lt;br /&gt;
   mod = 9001&lt;br /&gt;
   # Inițializare vector dp&lt;br /&gt;
   dp = [0] * (n + 1)&lt;br /&gt;
   dp[1] = 1&lt;br /&gt;
   # Calcul numărul de moduri&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       for j in range(1, k + 1):&lt;br /&gt;
           if i + j &amp;lt;= n:&lt;br /&gt;
               dp[i + j] = (dp[i + j] + dp[i]) % mod&lt;br /&gt;
   return dp[n]&lt;br /&gt;
Citire date de intrare&lt;br /&gt;
&lt;br /&gt;
n, k = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
Calcul și afișare rezultat&lt;br /&gt;
&lt;br /&gt;
result = numar_moduri_urcare_trepte(n, k) print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2487_-_countbits&amp;diff=9424</id>
		<title>2487 - countbits</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2487_-_countbits&amp;diff=9424"/>
		<updated>2024-01-11T18:23:28Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră un șir de numere naturale f[1], f[2], …, f[n]. Fiecărui element al șirului i se calculează numărul biților de 1 din reprezentarea în baza 2. De exemplu, numărul 15 are 4 biți de 1 în baza 2.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Să se determine numărul total de biți de 1 al tuturor numerelor din șir.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare countbits.in conține pe prima linie numerele n, A, B, C, D, E, unde n este numărul elementelor șirului. Șirul se va genera astfel: f[1] = A, f[2] = B, apoi pentru orice i = 3..n, f[i] = 1 + (f[i-2] * C + f[i-1] * D) % E.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire countbits.out va conține pe prima linie un singur număr, reprezentând numărul total de biți de 1 al tuturor numerelor din șir.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
3 ≤ n ≤ 15 000 000&lt;br /&gt;
3 ≤ A, B, C, D ≤ 100 000 000&lt;br /&gt;
3 ≤ E ≤ 1 000 000 000&lt;br /&gt;
Atenție la generarea elementelor șirului&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
countbits.in&lt;br /&gt;
&lt;br /&gt;
4 7 11 15 19 8999&lt;br /&gt;
countbits.out&lt;br /&gt;
&lt;br /&gt;
17&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def count_set_bits(num):&lt;br /&gt;
&lt;br /&gt;
   count = 0&lt;br /&gt;
   while num:&lt;br /&gt;
       count += num &amp;amp; 1&lt;br /&gt;
       num &amp;gt;&amp;gt;= 1&lt;br /&gt;
   return count&lt;br /&gt;
Citire date de intrare&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;countbits.in&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
   n, A, B, C, D, E = map(int, file.readline().split())&lt;br /&gt;
Generare șir și calcul număr total de biți de 1&lt;br /&gt;
&lt;br /&gt;
total_bits = 0 f = [A, B] for i in range(3, n + 1):&lt;br /&gt;
&lt;br /&gt;
   next_element = 1 + (f[i - 2] * C + f[i - 1] * D) % E&lt;br /&gt;
   f.append(next_element)&lt;br /&gt;
   total_bits += count_set_bits(next_element)&lt;br /&gt;
Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;countbits.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
   file.write(str(total_bits) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2332_-_primXXL&amp;diff=9423</id>
		<title>2332 - primXXL</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2332_-_primXXL&amp;diff=9423"/>
		<updated>2024-01-11T18:23:02Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dau n numere naturale şi un număr natural k. Aflaţi câte dintre numerele date îl divid pe k! ( k factorial).&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare primxxl.in conține pe prima linie numerele n şi k, iar pe a doua linie n numere naturale nenule separate prin spații.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire primxxl.out va conține pe prima linie numărul d, reprezentând numărul numerelor de pe a doua linie a fișierului de intrare care îl divid pe k!.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 10.000&lt;br /&gt;
1 ≤ k ≤ 1.000.000&lt;br /&gt;
numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000&lt;br /&gt;
Exemplu:&lt;br /&gt;
primxxl.in&lt;br /&gt;
&lt;br /&gt;
3 5&lt;br /&gt;
20 3 14&lt;br /&gt;
primxxl.out&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
==Explicație==&lt;br /&gt;
Avem k!=5!=120, iar dintre numerele date 20 şi 3 îl divid pe 120, deci două numere.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def factorial(k):&lt;br /&gt;
&lt;br /&gt;
   result = 1&lt;br /&gt;
   for i in range(2, k + 1):&lt;br /&gt;
       result *= i&lt;br /&gt;
   return result&lt;br /&gt;
Citire date de intrare&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;primxxl.in&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
   n, k = map(int, file.readline().split())&lt;br /&gt;
   numbers = list(map(int, file.readline().split()))&lt;br /&gt;
Calcularea factorialului lui k&lt;br /&gt;
&lt;br /&gt;
k_factorial = factorial(k)&lt;br /&gt;
&lt;br /&gt;
Numărarea câtor dintre numerele date îl divid pe k!&lt;br /&gt;
&lt;br /&gt;
count = sum(1 for num in numbers if k_factorial % num == 0)&lt;br /&gt;
&lt;br /&gt;
Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;primxxl.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
   file.write(str(count) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3315_-_Eratostene3&amp;diff=9422</id>
		<title>3315 - Eratostene3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3315_-_Eratostene3&amp;diff=9422"/>
		<updated>2024-01-11T18:22:30Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dau n numere naturale. Pentru fiecare număr aflaţi câţi divizori liberi de pătrate are acesta.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare eratostene4.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire eratostene4.out va conține pe prima linie, pentru fiecare număr din fişierul de intrare, numărul divizorilor liberi de pătrate ai acestuia.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 100.000&lt;br /&gt;
numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 10.000.000&lt;br /&gt;
un număr natural se numeşte liber de pătrate dacă nu se divide cu pătratul unui număr prim&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
eratostene4.in&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
20 8 5&lt;br /&gt;
eratostene4.out&lt;br /&gt;
&lt;br /&gt;
4 2 2&lt;br /&gt;
==Explicație==&lt;br /&gt;
Divizorii lui 20, liberi de pătrate, sunt: 1, 2, 5, 10.&lt;br /&gt;
Divizorii lui 8, liberi de pătrate, sunt: 1, 2.&lt;br /&gt;
Divizorii lui 5, liberi de pătrate, sunt: 1, 5.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def ciurul_lui_eratostene(limit):&lt;br /&gt;
&lt;br /&gt;
   primes = []&lt;br /&gt;
   is_prime = [True] * (limit + 1)&lt;br /&gt;
   is_prime[0] = is_prime[1] = False&lt;br /&gt;
   for i in range(2, int(limit**0.5) + 1):&lt;br /&gt;
       if is_prime[i]:&lt;br /&gt;
           primes.append(i)&lt;br /&gt;
           for j in range(i * i, limit + 1, i):&lt;br /&gt;
               is_prime[j] = False&lt;br /&gt;
   for i in range(int(limit**0.5) + 1, limit + 1):&lt;br /&gt;
       if is_prime[i]:&lt;br /&gt;
           primes.append(i)&lt;br /&gt;
   return primes&lt;br /&gt;
&lt;br /&gt;
def numar_divizori_liberi_de_patrate(numar, primes):&lt;br /&gt;
&lt;br /&gt;
   count = 1  # 1 este divizorul liber de pătrate&lt;br /&gt;
   for prime in primes:&lt;br /&gt;
       if prime * prime &amp;gt; numar:&lt;br /&gt;
           break&lt;br /&gt;
       exponent = 0&lt;br /&gt;
       while numar % prime == 0:&lt;br /&gt;
           numar //= prime&lt;br /&gt;
           exponent += 1&lt;br /&gt;
       count *= (exponent + 1)&lt;br /&gt;
   if numar &amp;gt; 1:&lt;br /&gt;
       count *= 2  # numărul însuși și 1&lt;br /&gt;
   return count - 2  # eliminăm divizorul 1 și numărul însuși&lt;br /&gt;
Citire date de intrare&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;eratostene4.in&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
   n = int(file.readline().strip())&lt;br /&gt;
   numbers = list(map(int, file.readline().split()))&lt;br /&gt;
Calcularea divizorilor primi&lt;br /&gt;
&lt;br /&gt;
max_number = max(numbers) primes = ciurul_lui_eratostene(max_number)&lt;br /&gt;
&lt;br /&gt;
Calcularea și afișarea rezultatelor&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;eratostene4.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
   for numar in numbers:&lt;br /&gt;
       result = numar_divizori_liberi_de_patrate(numar, primes)&lt;br /&gt;
       file.write(str(result) + &amp;quot; &amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2211_-_True&amp;diff=9421</id>
		<title>2211 - True</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2211_-_True&amp;diff=9421"/>
		<updated>2024-01-11T18:21:47Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Să considerăm o matrice cu N linii şi N coloane cu elemente numere naturale. În această matrice trebuie să plasăm două ture, în poziţii distincte. Spunem că un element al matricei este atacat dacă se află pe aceeaşi linie sau pe aceeaşi coloană cu una dintre cele două ture. Elementele din poziţiile celor două ture nu sunt considerate atacate.&lt;br /&gt;
Turele vor fi plasate astfel încât suma elementelor atacate să fie cât mai mare.&lt;br /&gt;
==Cerința==&lt;br /&gt;
Scrieţi un program care să determine suma elementelor atacate (maximă posibil).&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare ture.in va conţine pe prima linie un număr natural N, cu semnificaţia din enunţ. Pe fiecare dintre următoarele N linii se află câte N numere naturale, reprezentând elementele matricei.&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire ture.out va conţine o singură linie pe care va fi scrisă suma maximă.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
2 ≤ N ≤ 100&lt;br /&gt;
Elementele matricei sunt numere naturale mai mici sau egale cu 255&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
ture.in&lt;br /&gt;
5 &lt;br /&gt;
4 2 2 3 3 &lt;br /&gt;
4 2 1 4 0 &lt;br /&gt;
1 3 4 0 1 &lt;br /&gt;
4 3 0 2 3 &lt;br /&gt;
0 0 3 0 4 &lt;br /&gt;
ture.out&lt;br /&gt;
40&lt;br /&gt;
==Explicație==&lt;br /&gt;
Prima tură va fi plasată în poziţia (4,3), iar cea de a doua tură va fi plasată în poziţia (2,5).&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def find_max_attack_sum(matrix):&lt;br /&gt;
&lt;br /&gt;
   n = len(matrix)&lt;br /&gt;
   max_sum = 0&lt;br /&gt;
   for i in range(n):&lt;br /&gt;
       for j in range(n):&lt;br /&gt;
           for k in range(i + 1, n):&lt;br /&gt;
               for l in range(j + 1, n):&lt;br /&gt;
                   # Calculează suma elementelor atacate de turele plasate la (i, j) și (k, l)&lt;br /&gt;
                   attack_sum = sum(matrix[i][col] for col in range(n)) + sum(matrix[row][j] for row in range(n))&lt;br /&gt;
                   attack_sum -= matrix[i][j] + matrix[k][l]  # eliminăm dublurile&lt;br /&gt;
                   # Actualizează suma maximă&lt;br /&gt;
                   max_sum = max(max_sum, attack_sum)&lt;br /&gt;
   return max_sum&lt;br /&gt;
Citire date de intrare&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;ture.in&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
   n = int(file.readline().strip())&lt;br /&gt;
   matrix = [list(map(int, file.readline().split())) for _ in range(n)]&lt;br /&gt;
Găsește suma maximă a elementelor atacate&lt;br /&gt;
&lt;br /&gt;
result = find_max_attack_sum(matrix)&lt;br /&gt;
&lt;br /&gt;
Scrie rezultatul în fișierul de ieșire&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;ture.out&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
&lt;br /&gt;
   file.write(str(result) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2863_-_Pyk&amp;diff=9420</id>
		<title>2863 - Pyk</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2863_-_Pyk&amp;diff=9420"/>
		<updated>2024-01-11T18:21:14Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==pyk==&lt;br /&gt;
Fie k, n și y trei numere naturale. Fie X un șir format din n numere naturale: x1,x2,x3,…,xn. Fie P produsul numerelor y,x1,x2,x3,…,xn, adică P=y×x1×x2×x3×…×xn. Numărul P este o “k-putere” dacă există un număr natural z astfel încât P=zk.&lt;br /&gt;
&lt;br /&gt;
==Cerinta==&lt;br /&gt;
Scrieți un program care să citească numerele k,n,x1,x2,x3,…,xn&lt;br /&gt;
 și care să determine:&lt;br /&gt;
&lt;br /&gt;
1. cel mai mic și cel mai mare număr din șirul X ce sunt formate doar din cifre identice;&lt;br /&gt;
2. descompunerea în factori primi a celui mai mic număr natural y (y ≥ 2) cu proprietatea că numărul P=y×x1×x2×x3×…×xn&lt;br /&gt;
 este o “k-putere”.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare pyk.in conține:&lt;br /&gt;
&lt;br /&gt;
pe prima linie, un număr natural C, reprezentând cerința din problemă care trebuie rezolvată (1 sau 2);&lt;br /&gt;
pe a doua linie, numerele naturale k și n, separate printr-un singur spațiu;&lt;br /&gt;
pe a treia linie, cele n numere naturale x1,x2,x3,…,xn, separate prin câte un singur spaţiu.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă C=1, atunci prima linie a fişierului de ieşire pyk.out va conține două numere naturale, separate printr-un&lt;br /&gt;
singur spațiu, reprezentând răspunsul la cerința 1 a problemei. Dacă nu există astfel de numere, prima linie a&lt;br /&gt;
fișierului va conține valoarea 1.&lt;br /&gt;
&lt;br /&gt;
Dacă C=2, atunci fișierul de ieşire pyk.out va conține:&lt;br /&gt;
&lt;br /&gt;
pe prima linie, un număr natural m reprezentând numărul de factori primi distincți din descompunerea în&lt;br /&gt;
factori primi a numărului y, determinat la rezolvarea cerinței 2;&lt;br /&gt;
pe fiecare dintre următoarele m linii (câte o linie pentru fiecare factor prim din descompunerea în factori primi&lt;br /&gt;
a lui y), câte două valori F şi E, separate printr-un singur spaţiu, reprezentând factorul prim F și exponentul&lt;br /&gt;
E al acestui factor din descompunerea în factori primi a lui y.&lt;br /&gt;
Scrierea în fișier a acestor factori primi se va face în ordinea crescătoare a valorii lor.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
2 ≤ n ≤ 50.000&lt;br /&gt;
2 ≤ k ≤ 100&lt;br /&gt;
2 ≤  x1,x2,x3,…,xn&lt;br /&gt;
 ≤ 10.000&lt;br /&gt;
2 ≤ y&lt;br /&gt;
pentru rezolvarea corectă a cerinței 1 se acordă 10 puncte;&lt;br /&gt;
pentru rezolvarea corectă a cerinței 2 se acordă 90 puncte.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
pyk.in :&lt;br /&gt;
1&lt;br /&gt;
2 7&lt;br /&gt;
122 1111 5 4 88 123 999&lt;br /&gt;
pyk.out :&lt;br /&gt;
4 1111 &lt;br /&gt;
==Explicație==&lt;br /&gt;
Cerința este 1, k=2, n=7. Numerele din șirul X formate doar din cifre identice sunt: 1111, 5, 4, 88, 999. Cel mai mic număr dintre acestea este 4, iar cel mai mare este 1111.&lt;br /&gt;
&lt;br /&gt;
pyk.in :&lt;br /&gt;
2&lt;br /&gt;
3 6&lt;br /&gt;
12 5 60 125 4 36&lt;br /&gt;
pyk.out :&lt;br /&gt;
3&lt;br /&gt;
2 1&lt;br /&gt;
3 2&lt;br /&gt;
5 1&lt;br /&gt;
==Explicație==&lt;br /&gt;
Cerința este 2, k=3, n=6. Produsul celor 6 numere din șir este: 12*5*60*125*4*36=64800000. y=90 este cea mai mică valoare pentru care P = 90 * 64800000 = 18003 devine o “k-putere“. Descompunerea în factori primi a lui y conține m=3 factori&lt;br /&gt;
primi: 21×32×51.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def factorize(num):&lt;br /&gt;
&lt;br /&gt;
   factors = {}&lt;br /&gt;
   i = 2&lt;br /&gt;
   while i * i &amp;lt;= num:&lt;br /&gt;
       while num % i == 0:&lt;br /&gt;
           if i not in factors:&lt;br /&gt;
               factors[i] = 0&lt;br /&gt;
           factors[i] += 1&lt;br /&gt;
           num //= i&lt;br /&gt;
       i += 1&lt;br /&gt;
   if num &amp;gt; 1:&lt;br /&gt;
       factors[num] = 1&lt;br /&gt;
   return factors&lt;br /&gt;
&lt;br /&gt;
def k_power_factors(k, numbers):&lt;br /&gt;
&lt;br /&gt;
   product = 1&lt;br /&gt;
   for num in numbers:&lt;br /&gt;
       product *= num&lt;br /&gt;
   factors = factorize(product)&lt;br /&gt;
   k_factors = {key: value * k for key, value in factors.items()}&lt;br /&gt;
   return k_factors&lt;br /&gt;
&lt;br /&gt;
def identical_digits_numbers(numbers):&lt;br /&gt;
&lt;br /&gt;
   identical_numbers = [num for num in numbers if len(set(str(num))) == 1]&lt;br /&gt;
   return identical_numbers&lt;br /&gt;
Citire date de intrare&lt;br /&gt;
&lt;br /&gt;
C = int(input()) k, n = map(int, input().split()) numbers = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
if C == 1:&lt;br /&gt;
&lt;br /&gt;
   identical_numbers = identical_digits_numbers(numbers)&lt;br /&gt;
   if identical_numbers:&lt;br /&gt;
       print(min(identical_numbers), max(identical_numbers))&lt;br /&gt;
   else:&lt;br /&gt;
       print(&amp;quot;1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
elif C == 2:&lt;br /&gt;
&lt;br /&gt;
   k_factors = k_power_factors(k, numbers)&lt;br /&gt;
   distinct_factors = sorted(k_factors.keys())&lt;br /&gt;
   print(len(distinct_factors))&lt;br /&gt;
   for factor in distinct_factors:&lt;br /&gt;
       exponent = k_factors[factor]&lt;br /&gt;
       print(factor, exponent)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1812_-_Litere_Gen_1&amp;diff=9419</id>
		<title>1812 - Litere Gen 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1812_-_Litere_Gen_1&amp;diff=9419"/>
		<updated>2024-01-11T18:18:07Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Scrieți un program care citeşte o valoare naturală impară pentru n şi apoi generează şi afişează în ordine crescătoare lexicografic toate combinaţiile formate din n litere mici care îndeplinesc următoarele proprietăţi:&lt;br /&gt;
&lt;br /&gt;
- încep şi se termină cu a;&lt;br /&gt;
- oricare două litere alăturate dintr-o combinaţie sunt consecutive în alfabet.&lt;br /&gt;
Astfel, pentru n=5, combinaţiile afişate sunt, în ordine, următoarele: ababa, abcba.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n, impar.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran, pe rânduri separate, combinaţiile care îndeplinesc proprietăţile cerute.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
3 ≤ n ≤ 25&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
5&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
ababa&lt;br /&gt;
abcba&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def generate_combinations(current, n):&lt;br /&gt;
&lt;br /&gt;
   if len(current) == n:&lt;br /&gt;
       print(&amp;quot;&amp;quot;.join(current))&lt;br /&gt;
       return&lt;br /&gt;
   if not current:&lt;br /&gt;
       current.append(&#039;a&#039;)&lt;br /&gt;
       generate_combinations(current, n)&lt;br /&gt;
       current.pop()&lt;br /&gt;
   &lt;br /&gt;
   for char in range(ord(&#039;b&#039;), ord(&#039;a&#039;) + n):&lt;br /&gt;
       current.append(chr(char))&lt;br /&gt;
       generate_combinations(current, n)&lt;br /&gt;
       current.pop()&lt;br /&gt;
Citirea datelor de intrare&lt;br /&gt;
&lt;br /&gt;
n = int(input(&amp;quot;Introduceți n (număr impar): &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
if n % 2 == 0:&lt;br /&gt;
&lt;br /&gt;
   print(&amp;quot;Numărul introdus trebuie să fie impar.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
else:&lt;br /&gt;
&lt;br /&gt;
   # Generarea și afișarea combinațiilor&lt;br /&gt;
   generate_combinations([], n)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3945_-_Fazan_Max&amp;diff=9418</id>
		<title>3945 - Fazan Max</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3945_-_Fazan_Max&amp;diff=9418"/>
		<updated>2024-01-11T18:17:27Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dau n cuvinte distincte formate din litere mici. Afișați șirul format dintr-un număr maxim de cuvinte distincte dintre cele date, care respectă regula jocului Fazan. La jocul Fazan o succesiune de două cuvine a și b se consideră corectă dacă ultimele două litere din cuvântul a sunt identice cu primele două din b. De exemplu, cuvintele fazan și anterior sunt corecte în această ordine.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n și apoi n cuvinte, separate prin spații sau scrise pe rânduri separate.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran cuvintele care formează șirul cerut, separate prin câte un spațiu.&lt;br /&gt;
Dacă există mai multe șiruri formate dintr-un număr maxim de cuvinte, se va afișa cel mai mic lexicografic.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 30&lt;br /&gt;
cele n cuvinte sunt formate din litere mici, au lungimea cel puțin 2 și cel mult 20 și sunt distincte.&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
7&lt;br /&gt;
dor ana nasture repede alina diana decis&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
alina nasture repede decis&lt;br /&gt;
Explicație&lt;br /&gt;
&lt;br /&gt;
Există mai multe soluții de lungime maximă, dar cea afișată este minimă lexicografic. Celelalte soluții sunt:&lt;br /&gt;
&lt;br /&gt;
ana nasture repede decis&lt;br /&gt;
diana nasture repede decis&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def backtracking(current_path, remaining_words, result):&lt;br /&gt;
&lt;br /&gt;
   if not remaining_words:&lt;br /&gt;
       # Verificăm dacă șirul format este mai lung sau la fel de lung ca rezultatul curent&lt;br /&gt;
       if len(current_path) &amp;gt; len(result):&lt;br /&gt;
           return current_path&lt;br /&gt;
       elif len(current_path) == len(result):&lt;br /&gt;
           # Verificăm dacă șirul curent este lexicografic mai mic&lt;br /&gt;
           current_str = &amp;quot; &amp;quot;.join(current_path)&lt;br /&gt;
           result_str = &amp;quot; &amp;quot;.join(result)&lt;br /&gt;
           if current_str &amp;lt; result_str:&lt;br /&gt;
               return current_path&lt;br /&gt;
           else:&lt;br /&gt;
               return result&lt;br /&gt;
       else:&lt;br /&gt;
           return result&lt;br /&gt;
   last_word = current_path[-1] if current_path else None&lt;br /&gt;
   for word in remaining_words:&lt;br /&gt;
       if last_word is None or last_word[-2:] == word[:2]:&lt;br /&gt;
           new_path = current_path + [word]&lt;br /&gt;
           new_remaining = remaining_words.copy()&lt;br /&gt;
           new_remaining.remove(word)&lt;br /&gt;
           result = backtracking(new_path, new_remaining, result)&lt;br /&gt;
   return result&lt;br /&gt;
Citirea datelor de intrare&lt;br /&gt;
&lt;br /&gt;
n = int(input()) words = input().split()&lt;br /&gt;
&lt;br /&gt;
Sortăm cuvintele pentru a îmbunătăți eficiența algoritmului&lt;br /&gt;
&lt;br /&gt;
words.sort()&lt;br /&gt;
&lt;br /&gt;
Inițializăm rezultatul cu primul cuvânt&lt;br /&gt;
&lt;br /&gt;
initial_word = words.pop(0) result = backtracking([initial_word], words, [])&lt;br /&gt;
&lt;br /&gt;
Afișăm rezultatul&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot; &amp;quot;.join(result))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3415_-_Vector_Div&amp;diff=9417</id>
		<title>3415 - Vector Div</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3415_-_Vector_Div&amp;diff=9417"/>
		<updated>2024-01-11T18:16:44Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se da un vector cu n elemente. Asupra fiecărui element putem efectua 2 tipuri de operații: să-l adunăm sau să-l scădem cu 1. La final, fiecare element trebuie să fie divizor al elementului următor. Adică, v[i] îl divide pe v[i + 1], oricare ar fi 1 ≤ i &amp;lt; n. Știind că ultimul element nu poate fi modificat, aflați numărul minim de operații pentru ca vectorul să îndeplinească condiția dată.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul minim de operații.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 10&lt;br /&gt;
cele n numere citite vor fi mai mici sau egale cu 1.000.000&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
4&lt;br /&gt;
2 8 4 10&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
5&lt;br /&gt;
==Explicație==&lt;br /&gt;
Un exemplu de vector care respectă condiția este 1 5 5 10.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def min_operations(n, values):&lt;br /&gt;
&lt;br /&gt;
   max_value = max(values)&lt;br /&gt;
   dp = [[float(&#039;inf&#039;)] * (max_value + 1) for _ in range(n)]&lt;br /&gt;
   # Inițializăm prima coloană a matricei dp&lt;br /&gt;
   for j in range(1, max_value + 1):&lt;br /&gt;
       dp[0][j] = min(abs(values[0] - j), j - 1)&lt;br /&gt;
   for i in range(1, n):&lt;br /&gt;
       for j in range(1, max_value + 1):&lt;br /&gt;
           for k in range(1, max_value + 1):&lt;br /&gt;
               if j % k == 0:&lt;br /&gt;
                   dp[i][j] = min(dp[i][j], dp[i - 1][k] + abs(values[i] - j))&lt;br /&gt;
   # Alegem minimul din ultima linie a matricei dp&lt;br /&gt;
   result = min(dp[n - 1])&lt;br /&gt;
   return result&lt;br /&gt;
Citim input-ul&lt;br /&gt;
&lt;br /&gt;
n = int(input()) values = list(map(int, input().split()))&lt;br /&gt;
&lt;br /&gt;
Calculăm rezultatul&lt;br /&gt;
&lt;br /&gt;
result = min_operations(n, values)&lt;br /&gt;
&lt;br /&gt;
Afișăm rezultatul&lt;br /&gt;
&lt;br /&gt;
print(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1357_-_Plus_Minus&amp;diff=9416</id>
		<title>1357 - Plus Minus</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1357_-_Plus_Minus&amp;diff=9416"/>
		<updated>2024-01-11T18:15:57Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Fie n un număr natural.&lt;br /&gt;
Să se determine toate posibilitățile de alegere a semnelor + și - pentru care&lt;br /&gt;
n = (+|-) 12  + (+|-) 22 + ... + (+|-) n2&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare plusminus.in conține pe prima linie numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire plusminus.out va conține pe fiecare linie o succesiune de n semne + sau - , separate prin câte un spațiu, reprezentând câte o soluție a problemei. Dacă nu există soluție, atunci fișierul de ieșire va conține pe prima linie mesajul IMPOSIBIL.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 23&lt;br /&gt;
șirurile se vor afișa în ordine lexicografica; caracterul - este considerat mai mic decăt caracterul +&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
plusminus.in&lt;br /&gt;
&lt;br /&gt;
9&lt;br /&gt;
plusminus.out&lt;br /&gt;
&lt;br /&gt;
- - + - + - + + - &lt;br /&gt;
+ - - + - - + - +&lt;br /&gt;
+ + - - + + - - +&lt;br /&gt;
+ + + + - + - - +&lt;br /&gt;
==Explicație==&lt;br /&gt;
Sunt 4 posibilități:&lt;br /&gt;
1) 9 = -12 – 22 + 32 – 42 + 52 – 62 + 72 + 82 – 92&lt;br /&gt;
2) 9 = +12 – 22 – 32 + 42 – 52 – 62 + 72 – 82 + 92&lt;br /&gt;
3) 9 = +12 + 22 – 32 – 42 + 52 + 62 – 72 – 82 + 92&lt;br /&gt;
4) 9 = +12 + 22 + 32 + 42 – 52 + 62 – 72 – 82 + 92&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def solve_plus_minus(n, signs, current_sum, current_expression, result):&lt;br /&gt;
&lt;br /&gt;
   if len(current_expression) == n:&lt;br /&gt;
       if current_sum == 0:&lt;br /&gt;
           result.append(&amp;quot; &amp;quot;.join(current_expression))&lt;br /&gt;
       return&lt;br /&gt;
   for sign in signs:&lt;br /&gt;
       new_sum = current_sum + sign * (current_expression[-1] + 1) ** 2&lt;br /&gt;
       if new_sum &amp;lt;= n:&lt;br /&gt;
           solve_plus_minus(n, signs, new_sum, current_expression + [sign], result)&lt;br /&gt;
&lt;br /&gt;
def plus_minus(n):&lt;br /&gt;
&lt;br /&gt;
   signs = [-1, 1]  # -1 pentru minus, 1 pentru plus&lt;br /&gt;
   result = []&lt;br /&gt;
   # Inițial, începem cu primul termen, care este întotdeauna un plus&lt;br /&gt;
   solve_plus_minus(n, signs, 1, [1], result)&lt;br /&gt;
   if not result:&lt;br /&gt;
       result.append(&amp;quot;IMPOSIBIL&amp;quot;)&lt;br /&gt;
   return result&lt;br /&gt;
Citim input-ul&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;plusminus.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
&lt;br /&gt;
   n = int(f.readline().strip())&lt;br /&gt;
Calculăm rezultatul&lt;br /&gt;
&lt;br /&gt;
result = plus_minus(n)&lt;br /&gt;
&lt;br /&gt;
Scriem rezultatul în fișierul de ieșire&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;plusminus.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
&lt;br /&gt;
   for line in result:&lt;br /&gt;
       f.write(line + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3605_-_Desc_Prime&amp;diff=9415</id>
		<title>3605 - Desc Prime</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3605_-_Desc_Prime&amp;diff=9415"/>
		<updated>2024-01-11T18:14:40Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un număr natural nenul S. Să se determine numărul de moduri de a-l scrie pe S ca sumă de numere prime distincte, precum și o modalitate de a-l scrie pe S ca sumă de cât mai multe numere prime distincte.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul S.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa la ecran pe prima linie numărul nrSol, reprezentând numărul de moduri de a-l scrie pe S ca sumă de numere prime distincte, iar pe a doua linie o modalitate de a-l scrie pe S ca sumă de cât mai multe numere prime distincte. Dacă sunt mai multe soluții, se va afișa cea minimă lexicografic, iar numerele prime din soluție se vor scrie în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ S ≤ 100&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
20&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
4&lt;br /&gt;
2 5 13&lt;br /&gt;
==Explicație==&lt;br /&gt;
Sunt patru soluții: 3 17, 2 5 13, 7 13, 2 7 11. Dintre acestea, soluția care are cele mai multe numere prime și este minimă lexicografic este 2 5 13.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def is_prime(num):&lt;br /&gt;
&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 generate_primes(limit):&lt;br /&gt;
&lt;br /&gt;
   primes = []&lt;br /&gt;
   for i in range(2, limit + 1):&lt;br /&gt;
       if is_prime(i):&lt;br /&gt;
           primes.append(i)&lt;br /&gt;
   return primes&lt;br /&gt;
&lt;br /&gt;
def sum_of_primes(S, primes):&lt;br /&gt;
&lt;br /&gt;
   solutions = []&lt;br /&gt;
   def backtrack(target, path, start):&lt;br /&gt;
       if target == 0:&lt;br /&gt;
           solutions.append(path[:])&lt;br /&gt;
           return&lt;br /&gt;
       for i in range(start, len(primes)):&lt;br /&gt;
           if primes[i] &amp;gt; target:&lt;br /&gt;
               break&lt;br /&gt;
           path.append(primes[i])&lt;br /&gt;
           backtrack(target - primes[i], path, i + 1)&lt;br /&gt;
           path.pop()&lt;br /&gt;
   backtrack(S, [], 0)&lt;br /&gt;
   return solutions&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
       S = int(input(&amp;quot;Introduceți S: &amp;quot;))&lt;br /&gt;
       &lt;br /&gt;
       primes = generate_primes(S)&lt;br /&gt;
       solutions = sum_of_primes(S, primes)&lt;br /&gt;
       print(len(solutions))&lt;br /&gt;
       if solutions:&lt;br /&gt;
           print(&amp;quot; &amp;quot;.join(map(str, solutions[0])))&lt;br /&gt;
   except ValueError:&lt;br /&gt;
       print(&amp;quot;Introduceți un număr natural.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0344_-_Paranteze&amp;diff=9414</id>
		<title>0344 - Paranteze</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0344_-_Paranteze&amp;diff=9414"/>
		<updated>2024-01-11T18:13:54Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Se dă un număr natural par n. Generați toate șirurile de n paranteze rotunde care se închid corect.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fişierul de intrare paranteze.in conţine pe prima linie numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieşire==&lt;br /&gt;
Fişierul de ieşire paranteze.out va conţine pe fiecare linie câte un șir de n paranteze rotunde care se închid corect. Șirurile vor fi afișate în ordine lexicografică, considerând paranteza deschisa ( mai mică decât paranteza închisă ).&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
1 ≤ n ≤ 20, număr natural par&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
paranteze.in&lt;br /&gt;
&lt;br /&gt;
6&lt;br /&gt;
paranteze.out&lt;br /&gt;
&lt;br /&gt;
((()))&lt;br /&gt;
(()())&lt;br /&gt;
(())()&lt;br /&gt;
()(())&lt;br /&gt;
()()()&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def generate_parentheses(n, current, open_count, close_count):&lt;br /&gt;
&lt;br /&gt;
   if open_count == close_count == n:&lt;br /&gt;
       print(&amp;quot;&amp;quot;.join(current))&lt;br /&gt;
       return&lt;br /&gt;
   if open_count &amp;lt; n:&lt;br /&gt;
       generate_parentheses(n, current + [&#039;(&#039;], open_count + 1, close_count)&lt;br /&gt;
   if close_count &amp;lt; open_count:&lt;br /&gt;
       generate_parentheses(n, current + [&#039;)&#039;], open_count, close_count + 1)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
       n = int(input(&amp;quot;Introduceți n (număr natural par): &amp;quot;))&lt;br /&gt;
       &lt;br /&gt;
       if n % 2 == 0:&lt;br /&gt;
           generate_parentheses(n, [], 0, 0)&lt;br /&gt;
       else:&lt;br /&gt;
           print(&amp;quot;Introduceți un număr par.&amp;quot;)&lt;br /&gt;
   except ValueError:&lt;br /&gt;
       print(&amp;quot;Introduceți un număr natural par.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0322_-_Partitii_Numar_2&amp;diff=9413</id>
		<title>0322 - Partitii Numar 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0322_-_Partitii_Numar_2&amp;diff=9413"/>
		<updated>2024-01-11T18:13:16Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Se dă un număr natural n şi un număr m. Determinaţi, în ordine lexicografică, toate modalităţile de a-l scrie pe n ca sumă de cel puţin m numere naturale distincte.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fişierul de intrare partitiinumar2.in conţine pe prima linie numerele n şi m.&lt;br /&gt;
&lt;br /&gt;
==Date de ieşire==&lt;br /&gt;
Fişierul de ieşire partitiinumar2.out va conţine pe pe fiecare linie câte un şir de numere naturale ordonate strict crescător, separate prin câte un spaţiu. Suma numerelor din fiecare şir este n şi sunt cel puţin m numere în fiecare şir. Şirurile vor fi afişate în ordine lexicografică.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
1 ≤ m &amp;lt; n ≤ 40&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
partitiinumar2.in&lt;br /&gt;
&lt;br /&gt;
10 3&lt;br /&gt;
partitiinumar2.out&lt;br /&gt;
&lt;br /&gt;
1 2 3 4 &lt;br /&gt;
1 2 7 &lt;br /&gt;
1 3 6 &lt;br /&gt;
1 4 5 &lt;br /&gt;
2 3 5 &lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 def partitii(n, m, current, start):&lt;br /&gt;
   if n == 0 and len(current) &amp;gt;= m:&lt;br /&gt;
       print(&amp;quot; &amp;quot;.join(map(str, current)))&lt;br /&gt;
       return&lt;br /&gt;
   for i in range(start, n + 1):&lt;br /&gt;
       partitii(n - i, m, current + [i], i + 1)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
       n, m = map(int, input(&amp;quot;Introduceți n și m: &amp;quot;).split())&lt;br /&gt;
       &lt;br /&gt;
       partitii(n, m, [], 1)&lt;br /&gt;
   except ValueError:&lt;br /&gt;
       print(&amp;quot;Introduceți valori numerice valide.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0324_-_Partitii_Numar_4&amp;diff=9412</id>
		<title>0324 - Partitii Numar 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0324_-_Partitii_Numar_4&amp;diff=9412"/>
		<updated>2024-01-11T18:12:32Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa=&lt;br /&gt;
Se dă un =umăr natural n şi o mulţime cu m elemente, numere naturale nenule. Determinaţi, în ordine lexicografică, toate modalităţile de a-l scrie pe n ca sumă de termeni din acea mulţime.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fişierul de intrare partitiinumar4.in conţine pe prima linie numerele n şi m, iar pe a doua linie m numere naturale distincte, separate prin câte un spaţiu, reprezentând elementele mulţimii.&lt;br /&gt;
&lt;br /&gt;
==Date de ieşire==&lt;br /&gt;
Fişierul de ieşire partitiinumar4.out va conţine pe pe fiecare linie câte un şir de numere naturale din mulţimea dată, ordonate crescător, separate prin câte un spaţiu. Suma numerelor din fiecare şir este n. Şirurile vor fi afişate în ordine lexicografică.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
1 ≤ m &amp;lt; n ≤ 40&lt;br /&gt;
numerele de pe a doua linie a fişierului de intrare sunt mai mici decât n&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
partitiinumar4.in&lt;br /&gt;
&lt;br /&gt;
10 3&lt;br /&gt;
3 2 6&lt;br /&gt;
partitiinumar4.out&lt;br /&gt;
&lt;br /&gt;
2 2 2 2 2 &lt;br /&gt;
2 2 3 3 &lt;br /&gt;
2 2 6 &lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def partitii(n, m, set_nums, current, start):&lt;br /&gt;
&lt;br /&gt;
   if n == 0:&lt;br /&gt;
       print(&amp;quot; &amp;quot;.join(map(str, current)))&lt;br /&gt;
       return&lt;br /&gt;
   for i in range(start, m):&lt;br /&gt;
       if set_nums[i] &amp;lt;= n:&lt;br /&gt;
           partitii(n - set_nums[i], m, set_nums, current + [set_nums[i]], i)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
       n, m = map(int, input(&amp;quot;Introduceti n și m: &amp;quot;).split())&lt;br /&gt;
       set_nums = list(map(int, input(&amp;quot;Introduceti elementele multimii: &amp;quot;).split()))&lt;br /&gt;
       &lt;br /&gt;
       set_nums.sort()  # Sortăm mulțimea pentru a respecta ordinea lexicografică&lt;br /&gt;
       partitii(n, m, set_nums, [], 0)&lt;br /&gt;
   except ValueError:&lt;br /&gt;
       print(&amp;quot;Introduceti valori numerice valide.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1322_-_Partitii_Nr&amp;diff=9411</id>
		<title>1322 - Partitii Nr</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1322_-_Partitii_Nr&amp;diff=9411"/>
		<updated>2024-01-11T18:11:44Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Se dă un număr natural n. Determinaţi, în ordine lexicografică, toate modalităţile de a-l scrie pe n ca sumă de numere naturale ordonate crescător astfel încât diferența dintre doi termeni consecutivi ai sumei să fie cel puțin 2.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fişierul de intrare partitiinr.in conţine pe prima linie numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieşire==&lt;br /&gt;
Fişierul de ieşire partitiinr.out va conţine pe pe fiecare linie câte un şir de numere naturale ordonate crescător, separate prin câte un spaţiu. Suma numerelor din fiecare şir este n, iar diferența dintre oricare doi termeni consecutivi este cel puțin 2. Şirurile vor fi afişate în ordine lexicografică.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
1 ≤ n ≤ 100&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
partitiinr.in&lt;br /&gt;
&lt;br /&gt;
15&lt;br /&gt;
partitiinr.out&lt;br /&gt;
&lt;br /&gt;
1 3 11 &lt;br /&gt;
1 4 10 &lt;br /&gt;
1 5 9 &lt;br /&gt;
1 6 8 &lt;br /&gt;
1 14 &lt;br /&gt;
2 4 9 &lt;br /&gt;
2 5 8 &lt;br /&gt;
2 13 &lt;br /&gt;
3 5 7 &lt;br /&gt;
3 12 &lt;br /&gt;
4 11 &lt;br /&gt;
5 10 &lt;br /&gt;
6 9 &lt;br /&gt;
15 &lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def partitii(n, current, start):&lt;br /&gt;
&lt;br /&gt;
   if n == 0:&lt;br /&gt;
       print(&amp;quot; &amp;quot;.join(map(str, current)))&lt;br /&gt;
       return&lt;br /&gt;
   for i in range(start, n + 1):&lt;br /&gt;
       partitii(n - i, current + [i], i + 2)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
       n = int(input(&amp;quot;Introduceti valoarea lui n: &amp;quot;))&lt;br /&gt;
       partitii(n, [], 1)&lt;br /&gt;
   except ValueError:&lt;br /&gt;
       print(&amp;quot;Introduceti un numar natural valid.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3604_-_Sum_Cifs&amp;diff=9410</id>
		<title>3604 - Sum Cifs</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3604_-_Sum_Cifs&amp;diff=9410"/>
		<updated>2024-01-11T18:11:01Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Dându-se un număr natural nenul S, să se afișeze în ordine crescătoare toate numerele naturale cu cifre distincte care au suma cifrelor egală cu S.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul S.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran pe câte o linie și în ordine crescătoare numerele de cifre distincte care au suma cifrelor egală cu S. Dacă problema nu are nicio soluție, atunci se va afișa doar valoarea -1.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ S ≤ 44&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
4&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
4&lt;br /&gt;
13&lt;br /&gt;
31&lt;br /&gt;
40&lt;br /&gt;
103&lt;br /&gt;
130&lt;br /&gt;
301&lt;br /&gt;
310&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def cifre_distincte(numar):&lt;br /&gt;
&lt;br /&gt;
   return len(set(str(numar))) == len(str(numar))&lt;br /&gt;
&lt;br /&gt;
def genereaza_permutari(cifre, suma_dorita, permutare_curenta=[]):&lt;br /&gt;
&lt;br /&gt;
   if sum(permutare_curenta) == suma_dorita:&lt;br /&gt;
       numar = int(&amp;quot;&amp;quot;.join(map(str, permutare_curenta)))&lt;br /&gt;
       if cifre_distincte(numar):&lt;br /&gt;
           print(numar)&lt;br /&gt;
   elif sum(permutare_curenta) &amp;lt; suma_dorita:&lt;br /&gt;
       for cifra in cifre:&lt;br /&gt;
           genereaza_permutari(cifre, suma_dorita, permutare_curenta + [cifra])&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citirea sumei dorite&lt;br /&gt;
   S = int(input())&lt;br /&gt;
   # Cifrele disponibile pentru permutare&lt;br /&gt;
   cifre = list(range(1, 10))&lt;br /&gt;
   # Generarea și afișarea permutărilor&lt;br /&gt;
   genereaza_permutari(cifre, S)&lt;br /&gt;
   # Afisarea -1 daca nu exista solutie&lt;br /&gt;
   if cifre_distincte(S):&lt;br /&gt;
       print(-1)&lt;br /&gt;
&lt;br /&gt;
python sum_cifre_distincte.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3170_-_Plata_3&amp;diff=9409</id>
		<title>3170 - Plata 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3170_-_Plata_3&amp;diff=9409"/>
		<updated>2024-01-11T18:10:12Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se consideră n tipuri de bancnote, cu valorile v[1] v[2] ... v[n], ordonate strict crescător. Se cere să se determine o modalitate de a plăti integral o sumă dată S cu bancnotele disponibile, știind că se pot folosi oricâte bancnote de orice tip.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele n și S, apoi valorile v[1] v[2] ... v[n] ale bancnotelor.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran n numere, reprezentând o modalitate de plată a sumei S. Fiecare număr x[i] va reprezenta numărul de bancnote de valoarea x[i] folosite pentru plata sumei S.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 6&lt;br /&gt;
1 ≤ S ≤ 1000&lt;br /&gt;
1 ≤ v[i] ≤ 100&lt;br /&gt;
oricare variantă corectă de plată a sumei S va fi luată în considerare&lt;br /&gt;
pentru toate seturile de date există soluție&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
5 375&lt;br /&gt;
1 5 10 50 100&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
5 2 1 1 3 &lt;br /&gt;
==Observații==&lt;br /&gt;
Există și alte soluții valide.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def plata_bancnote(n, S, valori):&lt;br /&gt;
&lt;br /&gt;
   rezultat = [0] * n&lt;br /&gt;
   suma_ramasa = S&lt;br /&gt;
   for i in range(n - 1, -1, -1):&lt;br /&gt;
       bancnote_folosite = suma_ramasa // valori[i]&lt;br /&gt;
       rezultat[i] = bancnote_folosite&lt;br /&gt;
       suma_ramasa -= bancnote_folosite * valori[i]&lt;br /&gt;
   return rezultat&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citire date de intrare&lt;br /&gt;
   n, S = map(int, input().split())&lt;br /&gt;
   valori = list(map(int, input().split()))&lt;br /&gt;
   # Calcul și afișare rezultat&lt;br /&gt;
   rezultat = plata_bancnote(n, S, valori)&lt;br /&gt;
   print(*rezultat)&lt;br /&gt;
&lt;br /&gt;
python plata_bancnote_flexibil.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3169_-_Plata_2&amp;diff=9408</id>
		<title>3169 - Plata 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3169_-_Plata_2&amp;diff=9408"/>
		<updated>2024-01-11T18:09:29Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se consideră n tipuri de bancnote, cu valorile v[1] v[2] ... v[n], ordonate strict crescător. Pentru fiecare tip de bancnote se știe numărul de bancnote disponibile c[1] c[2] ... c[n]. Se cere să se determine o modalitate de a plăti integral o sumă dată S cu bancnotele disponibile, astfel încât să se folosească cel puțin o bancnotă de fiecare tip.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele n și S, apoi valorile v[1] v[2] ... v[n] ale bancnotelor și apoi c[1] c[2] ... c[n].&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran n numere, reprezentând o modalitate de plată a sumei S. Fiecare număr x[i] va reprezenta numărul de bancnote de valoarea x[i] folosite pentru plata sumei S.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 6&lt;br /&gt;
1 ≤ S ≤ 1000&lt;br /&gt;
1 ≤ v[i] ≤ 100&lt;br /&gt;
1 ≤ c[i] ≤ 10&lt;br /&gt;
oricare variantă corectă de plată a sumei S va fi luată în considerare&lt;br /&gt;
pentru toate seturile de date există soluție&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
5 375&lt;br /&gt;
1 5 10 50 100&lt;br /&gt;
6 3 4 6 1&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
5 2 1 5 1 &lt;br /&gt;
==Explicație==&lt;br /&gt;
Se folosesc cinci bancnote de 1 leu, două de 5 lei, una de 10 lei, cinci de 50 de lei și una de 100 de lei: 5 * 1 + 2 * 10 + 5 * 50 + 1 * 100 = 375.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def plata_bancnote(n, S, valori, cantitati):&lt;br /&gt;
&lt;br /&gt;
   rezultat = [0] * n&lt;br /&gt;
   suma_ramasa = S&lt;br /&gt;
   for i in range(n - 1, -1, -1):&lt;br /&gt;
       bancnote_folosite = min(suma_ramasa // valori[i], cantitati[i])&lt;br /&gt;
       rezultat[i] = bancnote_folosite&lt;br /&gt;
       suma_ramasa -= bancnote_folosite * valori[i]&lt;br /&gt;
   return rezultat&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citire date de intrare&lt;br /&gt;
   n, S = map(int, input().split())&lt;br /&gt;
   valori = list(map(int, input().split()))&lt;br /&gt;
   cantitati = list(map(int, input().split()))&lt;br /&gt;
   # Calcul și afișare rezultat&lt;br /&gt;
   rezultat = plata_bancnote(n, S, valori, cantitati)&lt;br /&gt;
   print(*rezultat)&lt;br /&gt;
&lt;br /&gt;
python plata_bancnote.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3197_-_Partitii_Nr_2&amp;diff=9407</id>
		<title>3197 - Partitii Nr 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3197_-_Partitii_Nr_2&amp;diff=9407"/>
		<updated>2024-01-11T18:08:49Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un număr natural n. Determinați, în ordine lexicografică, toate modalitățile de a-l scrie pe n ca sumă de numere naturale ordonate strict crescător astfel încât diferența dintre doi termeni consecutivi ai sumei să fie cel mult 2.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran pe fiecare linie câte un șir de numere naturale ordonate strict crescător, separate prin câte un spațiu. Suma numerelor din fiecare șir este n, iar diferența dintre oricare doi termeni consecutivi este cel mult 2. Șirurile vor fi afișate în ordine lexicografică.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 300&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
21&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
1 2 3 4 5 6 &lt;br /&gt;
1 2 4 6 8 &lt;br /&gt;
1 3 4 6 7 &lt;br /&gt;
2 3 4 5 7 &lt;br /&gt;
3 4 6 8 &lt;br /&gt;
3 5 6 7 &lt;br /&gt;
5 7 9 &lt;br /&gt;
6 7 8 &lt;br /&gt;
10 11 &lt;br /&gt;
21 &lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def partitii(n):&lt;br /&gt;
&lt;br /&gt;
   def backtracking(curent, suma, start):&lt;br /&gt;
       if suma == n:&lt;br /&gt;
           solutii.append(list(curent))&lt;br /&gt;
           return&lt;br /&gt;
       for i in range(start, n - suma + 1):&lt;br /&gt;
           if len(curent) == 0 or abs(curent[-1] - i) &amp;lt;= 2:&lt;br /&gt;
               curent.append(i)&lt;br /&gt;
               backtracking(curent, suma + i, i + 1)&lt;br /&gt;
               curent.pop()&lt;br /&gt;
   solutii = []&lt;br /&gt;
   backtracking([], 0, 1)&lt;br /&gt;
   return solutii&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n = int(input())&lt;br /&gt;
   # Calculăm și afișăm rezultatul&lt;br /&gt;
   rezultat = partitii(n)&lt;br /&gt;
   for solutie in rezultat:&lt;br /&gt;
       print(*solutie)&lt;br /&gt;
&lt;br /&gt;
python partitiinumar2.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0321_-_Partitii_Numar_1&amp;diff=9406</id>
		<title>0321 - Partitii Numar 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0321_-_Partitii_Numar_1&amp;diff=9406"/>
		<updated>2024-01-11T18:08:02Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Se dă un număr natural n. Determinaţi, în ordine lexicografică, toate modalităţile de a-l scrie pe n ca sumă de numere naturale distincte.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fişierul de intrare partitiinumar1.in conţine pe prima linie numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieşire==&lt;br /&gt;
Fişierul de ieşire partitiinumar1.out va conţine pe pe fiecare linie câte un şir de numere naturale ordonate strict crescător, separate prin câte un spaţiu. Suma numerelor din fiecare şir este n. Şirurile vor fi afişate în ordine lexicografică.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
1 ≤ n ≤ 40&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
partitiinumar1.in&lt;br /&gt;
&lt;br /&gt;
10&lt;br /&gt;
partitiinumar1.out&lt;br /&gt;
&lt;br /&gt;
1 2 3 4 &lt;br /&gt;
1 2 7 &lt;br /&gt;
1 3 6 &lt;br /&gt;
1 4 5 &lt;br /&gt;
1 9 &lt;br /&gt;
2 3 5 &lt;br /&gt;
2 8 &lt;br /&gt;
3 7 &lt;br /&gt;
4 6 &lt;br /&gt;
10 &lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def partitii(n):&lt;br /&gt;
&lt;br /&gt;
   def backtracking(curent, suma, start):&lt;br /&gt;
       if suma == n:&lt;br /&gt;
           solutii.append(list(curent))&lt;br /&gt;
           return&lt;br /&gt;
       for i in range(start, n - suma + 1):&lt;br /&gt;
           curent.append(i)&lt;br /&gt;
           backtracking(curent, suma + i, i + 1)&lt;br /&gt;
           curent.pop()&lt;br /&gt;
   solutii = []&lt;br /&gt;
   backtracking([], 0, 1)&lt;br /&gt;
   return solutii&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n = int(input())&lt;br /&gt;
   # Calculăm și afișăm rezultatul&lt;br /&gt;
   rezultat = partitii(n)&lt;br /&gt;
   for solutie in rezultat:&lt;br /&gt;
       print(*solutie)&lt;br /&gt;
&lt;br /&gt;
python partitiinumar1.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4036_-_KDivnn&amp;diff=9405</id>
		<title>4036 - KDivnn</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4036_-_KDivnn&amp;diff=9405"/>
		<updated>2024-01-11T18:07:19Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dau n şi k numere naturale nenule. Determinaţi cel mai mare număr natural de cel mult k cifre care divide pe nn.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele n şi k.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul cerut.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
2 ≤ n ≤ 10.000.000&lt;br /&gt;
1 ≤ k ≤ 12&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
6 3&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
972&lt;br /&gt;
==Explicație==&lt;br /&gt;
Cel mai mare număr de trei cifre care divide pe 66 este 972.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def cel_mai_mare_divizor_nn(n, k):&lt;br /&gt;
&lt;br /&gt;
   # Inițializăm cel mai mare număr cu k cifre&lt;br /&gt;
   cel_mai_mare_numar = 10**k - 1&lt;br /&gt;
   # Cautăm cel mai mare număr care să fie divizibil cu nn&lt;br /&gt;
   while cel_mai_mare_numar &amp;gt;= 0:&lt;br /&gt;
       if cel_mai_mare_numar % (n * n) == 0:&lt;br /&gt;
           return cel_mai_mare_numar&lt;br /&gt;
       cel_mai_mare_numar -= 1&lt;br /&gt;
   return -1  # Dacă nu găsim un astfel de număr, returnăm -1&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n, k = map(int, input().split())&lt;br /&gt;
   # Apelăm funcția și afișăm rezultatul&lt;br /&gt;
   rezultat = cel_mai_mare_divizor_nn(n, k)&lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&lt;br /&gt;
python divizor_nn.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3995_-_Partitii_Numar_6&amp;diff=9404</id>
		<title>3995 - Partitii Numar 6</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3995_-_Partitii_Numar_6&amp;diff=9404"/>
		<updated>2024-01-11T18:06:29Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un număr natural n. Determinați, în ordine lexicografică, toate modalitățile de a-l scrie pe n ca sumă de numere naturale impare distincte.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul natural n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe câte linie a ecranului câte un șir de numere naturale impare ordonate strict crescător, separate prin câte un spațiu. Suma numerelor din fiecare șir este n. Șirurile vor fi afișate în ordine lexicografică.&lt;br /&gt;
&lt;br /&gt;
Dacă nu există nicio modalitate de a-l scrie pe n ca sumă de numere naturale impare distincte se va afișa mesajul imposibil.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 40&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
16&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
1 3 5 7 &lt;br /&gt;
1 15 &lt;br /&gt;
3 13 &lt;br /&gt;
5 11 &lt;br /&gt;
7 9 &lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def generare_siruri(n, suma_curenta, sir_parcial, ultimul_numar):&lt;br /&gt;
&lt;br /&gt;
   # Verificăm dacă am atins suma dorită&lt;br /&gt;
   if suma_curenta == n:&lt;br /&gt;
       print(*sir_parcial)&lt;br /&gt;
       return&lt;br /&gt;
   elif suma_curenta &amp;gt; n:&lt;br /&gt;
       return&lt;br /&gt;
   # Generăm numere impare și continuăm recursiv&lt;br /&gt;
   for i in range(ultimul_numar + 2, n + 1, 2):&lt;br /&gt;
       generare_siruri(n, suma_curenta + i, sir_parcial + [i], i)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n = int(input())&lt;br /&gt;
   # Apelăm funcția pentru a afișa șirurile&lt;br /&gt;
   generare_siruri(n, 0, [], 0)&lt;br /&gt;
   # Verificăm dacă nu există nicio modalitate de a-l scrie pe n ca sumă de numere naturale impare distincte&lt;br /&gt;
   if n % 2 == 0:&lt;br /&gt;
       print(&amp;quot;imposibil&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
python sumaNImpareDistincte.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3994_-_Partitii_Numar_5&amp;diff=9403</id>
		<title>3994 - Partitii Numar 5</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3994_-_Partitii_Numar_5&amp;diff=9403"/>
		<updated>2024-01-11T18:05:50Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un număr natural n. Determinați, în ordine lexicografică, toate modalitățile de a-l scrie pe n ca sumă de numere naturale pare.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul natural n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe câte linie a ecranului câte un șir de numere naturale pare ordonate crescător, separate prin câte un spațiu. Suma numerelor din fiecare șir este n. Șirurile vor fi afișate în ordine lexicografică.&lt;br /&gt;
&lt;br /&gt;
Dacă nu există nicio modalitate de a-l scrie pe n ca sumă de numere naturale pare se va afișa mesajul imposibil.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 40&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
10&lt;br /&gt;
Ieșire&lt;br /&gt;
2 2 2 2 2 &lt;br /&gt;
2 2 2 4 &lt;br /&gt;
2 2 6 &lt;br /&gt;
2 4 4 &lt;br /&gt;
2 8 &lt;br /&gt;
4 6 &lt;br /&gt;
10&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def generare_siruri(n, suma_curenta, sir_parcial):&lt;br /&gt;
&lt;br /&gt;
   # Verificăm dacă am atins suma dorită&lt;br /&gt;
   if suma_curenta == n:&lt;br /&gt;
       print(*sir_parcial)&lt;br /&gt;
       return&lt;br /&gt;
   elif suma_curenta &amp;gt; n:&lt;br /&gt;
       return&lt;br /&gt;
   # Generăm numere pare și continuăm recursiv&lt;br /&gt;
   for i in range(2, n + 1, 2):&lt;br /&gt;
       generare_siruri(n, suma_curenta + i, sir_parcial + [i])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n = int(input())&lt;br /&gt;
   # Apelăm funcția pentru a afișa șirurile&lt;br /&gt;
   generare_siruri(n, 0, [])&lt;br /&gt;
   # Verificăm dacă nu există nicio modalitate de a-l scrie pe n ca sumă de numere naturale pare&lt;br /&gt;
   if n % 2 != 0:&lt;br /&gt;
       print(&amp;quot;imposibil&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
python sumaNNumerePare.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2245_-_Plata_1&amp;diff=9402</id>
		<title>2245 - Plata 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2245_-_Plata_1&amp;diff=9402"/>
		<updated>2024-01-11T18:05:08Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se consideră n tipuri de bancnote, cu valorile v[1] v[2] ... v[n], ordonate strict crescător. Pentru fiecare tip de bancnote se știe numărul de bancnote disponibile c[1] c[2] ... c[n]. Se cere să se determine o modalitate de a plăti integral o sumă dată S cu bancnotele disponibile.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele n și S, apoi valorile v[1] v[2] ... v[n] ale bancnotelor și apoi c[1] c[2] ... c[n].&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran n numere, reprezentând o modalitate de plată a sumei S. Fiecare număr x[i] va reprezenta numărul de bancnote de valoarea x[i] folosite pentru plata sumei S.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
1 ≤ n ≤ 6&lt;br /&gt;
1 ≤ S ≤ 1000&lt;br /&gt;
1 ≤ v[i] ≤ 100&lt;br /&gt;
1 ≤ c[i] ≤ 10&lt;br /&gt;
oricare variantă corectă de plată a sumei S va fi luată în considerare&lt;br /&gt;
pentru toate seturile de date există soluție&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
Intrare&lt;br /&gt;
&lt;br /&gt;
5 375&lt;br /&gt;
1 5 10 50 100&lt;br /&gt;
6 3 4 6 1&lt;br /&gt;
Ieșire&lt;br /&gt;
&lt;br /&gt;
5 0 2 5 1&lt;br /&gt;
==Explicație==&lt;br /&gt;
Se folosesc cinci bancnote de 1 leu, două de 10 lei, cinci de 50 de lei și una de 100 de lei: 5 * 1 + 2 * 10 + 5 * 50 + 1 * 100 = 375.&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def plata_bancnote(n, S, valori, cantitati):&lt;br /&gt;
&lt;br /&gt;
   rezultat = [0] * n&lt;br /&gt;
   suma_actuala = 0&lt;br /&gt;
   for i in range(n - 1, -1, -1):&lt;br /&gt;
       while suma_actuala + valori[i] &amp;lt;= S and cantitati[i] &amp;gt; 0:&lt;br /&gt;
           suma_actuala += valori[i]&lt;br /&gt;
           cantitati[i] -= 1&lt;br /&gt;
           rezultat[i] += 1&lt;br /&gt;
   return rezultat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n, S = map(int, input().split())&lt;br /&gt;
   valori = list(map(int, input().split()))&lt;br /&gt;
   cantitati = list(map(int, input().split()))&lt;br /&gt;
   # Apelăm funcția pentru a obține rezultatul&lt;br /&gt;
   rezultat = plata_bancnote(n, S, valori, cantitati)&lt;br /&gt;
   # Afișăm rezultatul&lt;br /&gt;
   print(*rezultat)&lt;br /&gt;
&lt;br /&gt;
python plata_bancnote.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1356_-_N_Sir&amp;diff=9401</id>
		<title>1356 - N Sir</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1356_-_N_Sir&amp;diff=9401"/>
		<updated>2024-01-11T18:03:07Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Fie n un număr natural.&lt;br /&gt;
Să se determine toate șirurile a de k numere naturale nu neapărat distincte: 1 ≤ a1, a2,...,ak  ≤ n, astfel încât:&lt;br /&gt;
1) 1 = 1/a1+ 1/a2+...+ 1/ak&lt;br /&gt;
2) n = a1 + a2 +...+ ak&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare nsir.in conține pe prima linie numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire nsir.out va conține pe fiecare linie câte un șir determinat, în ordine lexicografică. Dacă nu poate fi generat un astfel de șir, atunci se va scrie valoarea 0 pe prima linie a fișierului de ieșire.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
5 ≤ n ≤ 75&lt;br /&gt;
se admite că cerința 1) este satisfăcută dacă: | 1/a1 + 1/a2 + … + 1/ak – 1 |&amp;lt;10-5&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
nsir.in&lt;br /&gt;
&lt;br /&gt;
33&lt;br /&gt;
nsir.out&lt;br /&gt;
&lt;br /&gt;
3 3 9 9 9&lt;br /&gt;
3 5 5 5 15&lt;br /&gt;
==Explicație==&lt;br /&gt;
Se observă că&lt;br /&gt;
1) 1 = 1/3+1/3+1/9+1/9+1/9 și 33 = 3+3+9+9+9&lt;br /&gt;
2) 1 = 1/3+1/5+1/5+1/5+1/15 și 33 = 3+5+5+5+15&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def backtracking(n, k, target_sum, current_sum, current_sequence, result):&lt;br /&gt;
&lt;br /&gt;
   if k == 0:&lt;br /&gt;
       if current_sum == target_sum:&lt;br /&gt;
           result.append(list(current_sequence))&lt;br /&gt;
       return&lt;br /&gt;
   for i in range(1, min(n, target_sum - current_sum) + 1):&lt;br /&gt;
       current_sequence.append(i)&lt;br /&gt;
       backtracking(n, k - 1, target_sum, current_sum + i, current_sequence, result)&lt;br /&gt;
       current_sequence.pop()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_sequences(n):&lt;br /&gt;
&lt;br /&gt;
   result = []&lt;br /&gt;
   for k in range(2, n + 1):&lt;br /&gt;
       backtracking(n, k, n, 0, [], result)&lt;br /&gt;
   return result&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim numărul n din fișierul de intrare&lt;br /&gt;
   with open(&amp;quot;nsir.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       n = int(f.readline().strip())&lt;br /&gt;
   # Găsim și afișăm șirurile în fișierul de ieșire&lt;br /&gt;
   sequences = find_sequences(n)&lt;br /&gt;
   with open(&amp;quot;nsir.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       if not sequences:&lt;br /&gt;
           g.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
       else:&lt;br /&gt;
           for sequence in sequences:&lt;br /&gt;
               g.write(&amp;quot; &amp;quot;.join(map(str, sequence)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
python nsir.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0323_-_Partitii_Numar_3&amp;diff=9400</id>
		<title>0323 - Partitii Numar 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0323_-_Partitii_Numar_3&amp;diff=9400"/>
		<updated>2024-01-11T17:47:11Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Se dă un număr natural n şi un interval [a,b]. Determinaţi, în ordine lexicografică, toate modalităţile de a-l scrie pe n ca sumă de numere naturale din intervalul [a,b].&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fişierul de intrare partitiinumar3.in conţine pe prima linie numerele n, a şi b.&lt;br /&gt;
&lt;br /&gt;
==Date de ieşire==&lt;br /&gt;
Fişierul de ieşire partitiinumar3.out va conţine pe pe fiecare linie câte un şir de numere naturale din intervalul [a,b], ordonate crescător, separate prin câte un spaţiu. Suma numerelor din fiecare şir este n. Şirurile vor fi afişate în ordine lexicografică.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
1 ≤ a &amp;lt; b &amp;lt; n ≤ 40&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
partitiinumar3.in&lt;br /&gt;
&lt;br /&gt;
10 2 4&lt;br /&gt;
partitiinumar3.out&lt;br /&gt;
&lt;br /&gt;
2 2 2 2 2 &lt;br /&gt;
2 2 2 4 &lt;br /&gt;
2 2 3 3 &lt;br /&gt;
2 4 4 &lt;br /&gt;
3 3 4 &lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def partitii_n(n, a, b, solutie):&lt;br /&gt;
&lt;br /&gt;
   if n == 0:&lt;br /&gt;
       print(&amp;quot; &amp;quot;.join(map(str, solutie)))&lt;br /&gt;
       return&lt;br /&gt;
   for i in range(a, min(b + 1, n + 1)):&lt;br /&gt;
       partitii_n(n - i, i, b, solutie + [i])&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim numerele n, a și b din fișierul de intrare&lt;br /&gt;
   with open(&amp;quot;partitiinumar3.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       n, a, b = map(int, f.readline().split())&lt;br /&gt;
   # Apelăm funcția de partizionare și afișăm rezultatul în fișierul de ieșire&lt;br /&gt;
   with open(&amp;quot;partitiinumar3.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       partitii_n(n, a, b, [])&lt;br /&gt;
&lt;br /&gt;
python partitiinumar3.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0319_-_Suma_35&amp;diff=9399</id>
		<title>0319 - Suma 35</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0319_-_Suma_35&amp;diff=9399"/>
		<updated>2024-01-11T17:46:27Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Se dă un număr natural nenul n. Să se determine toate modalităţile distincte de descompunere a numărului n în sumă de 3 şi 5.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fişierul de intrare suma35.in conţine pe prima linie numărul n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieşire==&lt;br /&gt;
Fişierul de ieşire suma35.out va conţine, în ordine lexicografică, toate modalităţile de descompunere a lui n în suma de 3 şi 5. Elementele fiecărei descompuneri vor fi scrie pe câte o linie a fişierului şi separate printr-un spaţiu.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
1 ≤ n ≤ 1000&lt;br /&gt;
pentru fiecare dintre valorile lui n folosite în fişierele de test există cel puţin o soluţie&lt;br /&gt;
în fiecare descompunere elementele vor fi aranjate crescător&lt;br /&gt;
==Exemplu==:&lt;br /&gt;
suma35.in&lt;br /&gt;
&lt;br /&gt;
40&lt;br /&gt;
suma35.out&lt;br /&gt;
&lt;br /&gt;
3 3 3 3 3 3 3 3 3 3 5 5 &lt;br /&gt;
3 3 3 3 3 5 5 5 5 5 &lt;br /&gt;
5 5 5 5 5 5 5 5 &lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def descompunere_35(n, solutie):&lt;br /&gt;
&lt;br /&gt;
   if n == 0:&lt;br /&gt;
       print(&amp;quot; &amp;quot;.join(map(str, solutie)))&lt;br /&gt;
       return&lt;br /&gt;
   if n &amp;gt;= 3:&lt;br /&gt;
       descompunere_35(n - 3, solutie + [3])&lt;br /&gt;
   if n &amp;gt;= 5:&lt;br /&gt;
       descompunere_35(n - 5, solutie + [5])&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim numărul n din fișierul de intrare&lt;br /&gt;
   with open(&amp;quot;suma35.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       n = int(f.readline().strip())&lt;br /&gt;
   # Apelăm funcția de descompunere și afișăm rezultatul în fișierul de ieșire&lt;br /&gt;
   with open(&amp;quot;suma35.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
       descompunere_35(n, [])&lt;br /&gt;
&lt;br /&gt;
python suma35.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3982_-_Descp2&amp;diff=9398</id>
		<title>3982 - Descp2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3982_-_Descp2&amp;diff=9398"/>
		<updated>2024-01-11T17:45:24Z</updated>

		<summary type="html">&lt;p&gt;Mraa: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Considerăm trei numere naturale nenule: n, k şi x. Denumim o kx-descompunere a numărului n o posibilitate de a scrie numărul n ca sumă de k numere naturale nenule astfel încât diferenţa între oricare doi termeni ai sumei este cel puţin egală cu x.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Fiind date trei numere naturale n, k şi x, să se determine câte kx-descompuneri distincte există. Două kx-descompuneri sunt distincte dacă diferă prin cel puţin un termen.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare kx_desc.in conține pe prima linie trei valori naturale nenule reprezentând numerele n, k şi x.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire kx_desc.out va conține o singură valoare reprezentând restul împărţirii numărului de kx-descompuneri distincte la numărul 10007.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
Pentru 20% din teste 0 &amp;lt; n ≤ 200; pentru celelalte 80% din teste, 200 &amp;lt; n ≤ 10000;&lt;br /&gt;
1 ≤ x, k ≤ n&lt;br /&gt;
==Exemplul 1==:&lt;br /&gt;
kx_desc.in&lt;br /&gt;
&lt;br /&gt;
20 2 3&lt;br /&gt;
kx_desc.out&lt;br /&gt;
&lt;br /&gt;
8&lt;br /&gt;
==Explicație==&lt;br /&gt;
Numărul de kx-descompuneri în acest caz este 8. Acestea sunt formate din numerele 1 şi 19; 2 şi 18; 3 şi 17; 4 şi 16; 5 şi 15; 6 şi 14; 7 şi 13; 8 şi 12.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==:&lt;br /&gt;
kx_desc.in&lt;br /&gt;
&lt;br /&gt;
2000 19 7&lt;br /&gt;
kx_desc.out&lt;br /&gt;
&lt;br /&gt;
3184&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 10007&lt;br /&gt;
&lt;br /&gt;
def kx_descompuneri(n, k, x):&lt;br /&gt;
&lt;br /&gt;
   dp = [[0] * (x + 1) for _ in range(n + 1)]&lt;br /&gt;
   dp[0][0] = 1&lt;br /&gt;
   for i in range(1, n + 1):&lt;br /&gt;
       for j in range(1, min(i, k) + 1):&lt;br /&gt;
           for l in range(x + 1):&lt;br /&gt;
               dp[i][l] = (dp[i][l] + dp[i - j][l - 1]) % MOD&lt;br /&gt;
   rezultat = 0&lt;br /&gt;
   for i in range(n - k * x + 1, n + 1):&lt;br /&gt;
       rezultat = (rezultat + dp[i][x]) % MOD&lt;br /&gt;
   return rezultat&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n, k, x = map(int, input().split())&lt;br /&gt;
   # Calculăm rezultatul și îl afișăm&lt;br /&gt;
   rezultat = kx_descompuneri(n, k, x)&lt;br /&gt;
   print(rezultat)&lt;br /&gt;
python kx_desc.py &amp;lt; kx_desc.in&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4284_-_Kx_Desc&amp;diff=9397</id>
		<title>4284 - Kx Desc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4284_-_Kx_Desc&amp;diff=9397"/>
		<updated>2024-01-11T17:43:48Z</updated>

		<summary type="html">&lt;p&gt;Mraa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Considerăm trei numere naturale nenule: n, k şi x. Denumim o kx-descompunere a numărului n o posibilitate de a scrie numărul n ca sumă de k numere naturale nenule astfel încât diferenţa între oricare doi termeni ai sumei este cel puţin egală cu x.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Fiind date trei numere naturale n, k şi x, să se determine câte kx-descompuneri distincte există. Două kx-descompuneri sunt distincte dacă diferă prin cel puţin un termen.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare kx_desc.in conține pe prima linie trei valori naturale nenule reprezentând numerele n, k şi x.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire kx_desc.out va conține o singură valoare reprezentând restul împărţirii numărului de kx-descompuneri distincte la numărul 10007.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
Pentru 20% din teste 0 &amp;lt; n ≤ 200; pentru celelalte 80% din teste, 200 &amp;lt; n ≤ 10000;&lt;br /&gt;
1 ≤ x, k ≤ n&lt;br /&gt;
==Exemplul 1==:&lt;br /&gt;
kx_desc.in&lt;br /&gt;
&lt;br /&gt;
20 2 3&lt;br /&gt;
kx_desc.out&lt;br /&gt;
&lt;br /&gt;
8&lt;br /&gt;
==Explicație==&lt;br /&gt;
Numărul de kx-descompuneri în acest caz este 8. Acestea sunt formate din numerele 1 şi 19; 2 şi 18; 3 şi 17; 4 şi 16; 5 şi 15; 6 şi 14; 7 şi 13; 8 şi 12.&lt;br /&gt;
&lt;br /&gt;
==Exemplul 2==:&lt;br /&gt;
kx_desc.in&lt;br /&gt;
&lt;br /&gt;
2000 19 7&lt;br /&gt;
kx_desc.out&lt;br /&gt;
&lt;br /&gt;
3184&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
MOD = 10007&lt;br /&gt;
&lt;br /&gt;
def kx_descompuneri(n, k, x):&lt;br /&gt;
&lt;br /&gt;
   dp = [[0] * (x + 1) for _ in range(n + 1)]&lt;br /&gt;
   for i in range(x + 1):&lt;br /&gt;
       dp[i][i] = 1&lt;br /&gt;
   for i in range(x + 1, n + 1):&lt;br /&gt;
       for j in range(1, x + 1):&lt;br /&gt;
           dp[i][j] = (dp[i - 1][j - 1] + dp[i - x - 1][j]) % MOD&lt;br /&gt;
   rezultat = 0&lt;br /&gt;
   for i in range(n - x + 1, n + 1):&lt;br /&gt;
       rezultat = (rezultat + dp[i][x]) % MOD&lt;br /&gt;
   return rezultat&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
   # Citim datele de intrare&lt;br /&gt;
   n, k, x = map(int, input().split())&lt;br /&gt;
   # Calculăm rezultatul și îl afișăm&lt;br /&gt;
   rezultat = kx_descompuneri(n, k, x)&lt;br /&gt;
   print(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mraa</name></author>
	</entry>
</feed>