<?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=Cata</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=Cata"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Cata"/>
	<updated>2026-05-01T05:56:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=27930&amp;diff=9526</id>
		<title>27930</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=27930&amp;diff=9526"/>
		<updated>2024-01-16T15:48:26Z</updated>

		<summary type="html">&lt;p&gt;Cata: Pagină nouă: &amp;#039;&amp;#039;&amp;#039;27930  (Nicolae Mușuroia) &amp;#039;&amp;#039;&amp;#039; &amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt;  : &amp;#039;&amp;#039;Fie&amp;#039;&amp;#039; &amp;lt;math&amp;gt;z_1, z_2&amp;lt;/math&amp;gt; &amp;#039;&amp;#039;respectiv&amp;#039;&amp;#039; &amp;lt;math&amp;gt;z_3&amp;lt;/math&amp;gt;, &amp;#039;&amp;#039;afixele vârfurilor triunghiului&amp;#039;&amp;#039; &amp;lt;math&amp;gt;A_1A_2A_3&amp;lt;/math&amp;gt;, &amp;#039;&amp;#039;înscris în cercul&amp;#039;&amp;#039; &amp;lt;math&amp;gt;C(0,1)&amp;lt;/math&amp;gt;. &amp;#039;&amp;#039;Arătați că triunghiul&amp;#039;&amp;#039; &amp;lt;math&amp;gt;A_1A_2A_3&amp;lt;/math&amp;gt; &amp;#039;&amp;#039;este echilateral dacă și numai dacă&amp;#039;&amp;#039; &amp;lt;math&amp;gt;(z_1+z_2)(z_2+z_3)(z_3+z_1) \not= 0&amp;lt;/math&amp;gt; &amp;#039;&amp;#039;și&amp;#039;&amp;#039; &amp;lt;math&amp;gt;\frac{1}{z_1+z_2} + \frac{1}{z_2+z_3} + \frac{1}{z_3+z_1} = 0&amp;lt;/math&amp;gt;.  &amp;#039;&amp;#039;&amp;#039;Soluție.&amp;#039;&amp;#039;&amp;#039; Dacă &amp;lt;math&amp;gt;A_1A...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;27930  (Nicolae Mușuroia) &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt; &lt;br /&gt;
: &#039;&#039;Fie&#039;&#039; &amp;lt;math&amp;gt;z_1, z_2&amp;lt;/math&amp;gt; &#039;&#039;respectiv&#039;&#039; &amp;lt;math&amp;gt;z_3&amp;lt;/math&amp;gt;, &#039;&#039;afixele vârfurilor triunghiului&#039;&#039; &amp;lt;math&amp;gt;A_1A_2A_3&amp;lt;/math&amp;gt;, &#039;&#039;înscris în cercul&#039;&#039; &amp;lt;math&amp;gt;C(0,1)&amp;lt;/math&amp;gt;. &#039;&#039;Arătați că triunghiul&#039;&#039; &amp;lt;math&amp;gt;A_1A_2A_3&amp;lt;/math&amp;gt; &#039;&#039;este echilateral dacă și numai dacă&#039;&#039; &amp;lt;math&amp;gt;(z_1+z_2)(z_2+z_3)(z_3+z_1) \not= 0&amp;lt;/math&amp;gt; &#039;&#039;și&#039;&#039; &amp;lt;math&amp;gt;\frac{1}{z_1+z_2} + \frac{1}{z_2+z_3} + \frac{1}{z_3+z_1} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Soluție.&#039;&#039;&#039; Dacă &amp;lt;math&amp;gt;A_1A_2A_3&amp;lt;/math&amp;gt; este triunghi echilateral, afixele punctelor &amp;lt;math&amp;gt; A_1, A_2, A_3&amp;lt;/math&amp;gt; sunt &amp;lt;math&amp;gt;z_1, \epsilon z_1&amp;lt;/math&amp;gt; și &amp;lt;math&amp;gt; \epsilon ^2 z_1&amp;lt;/math&amp;gt;, unde &amp;lt;math&amp;gt;\epsilon \in \mathbb{C} &amp;lt;/math&amp;gt; astfel încât &amp;lt;math&amp;gt; \epsilon ^2 + \epsilon + 1 = 0&amp;lt;/math&amp;gt;, iar relația din enunț se verifică prin calcul elementar.&lt;br /&gt;
: Reciproc, condiția din enunț se scrie echivalent&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;gt;(z_1+z_2)(z_2+z_3) + (z_2+z_3)(z_3+z_1) + (z_3+z_1)(z_1+z_2) = 0,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
iar după calcule se rescrie &amp;lt;math&amp;gt;(z_1+z_2+z_3)^2 = -(z_1z_2+z_2z_3+z_3z_1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
: Întrucât &amp;lt;math&amp;gt;|z_1| = |z_2| = |z_3| = 1&amp;lt;/math&amp;gt;, deducem că&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt; \overline{z_1+z_2+z_3} = \frac{1}{z_1} + \frac{1}{z_2} + \frac{1}{z_3} = \frac{z_1z_2+z_2z_3+z_3z_1}{z_1z_2z_3} = -\frac{(z_1+z_2+z_3)^2}{z_1z_2z_3}.&amp;lt;/math&amp;gt;&lt;br /&gt;
: Trecând la module, rezultă că &amp;lt;math&amp;gt;|z_1+z_2+z_3| = |z_1+z_2+z_3|^2&amp;lt;/math&amp;gt;. Întrucât ortocentrul &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; al triunghiului &amp;lt;math&amp;gt;A_1A_2A_3&amp;lt;/math&amp;gt; are afixul &amp;lt;math&amp;gt;h = z_1+z_2+z_3&amp;lt;/math&amp;gt;, obținem &amp;lt;math&amp;gt;|h| \in \{0,1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
: Dacă &amp;lt;math&amp;gt;|h| = 1&amp;lt;/math&amp;gt;, atunci &amp;lt;math&amp;gt; H \in C(0,1)&amp;lt;/math&amp;gt;. Rezultă că triunghiul &amp;lt;math&amp;gt;A_1A_2A_3&amp;lt;/math&amp;gt; este dreptunghic și &amp;lt;math&amp;gt;z_1+z_2 = 0&amp;lt;/math&amp;gt; sau &amp;lt;math&amp;gt;z_2+z_3 = 0&amp;lt;/math&amp;gt; sau &amp;lt;math&amp;gt;z_3+z_1 = 0&amp;lt;/math&amp;gt;, fals.&lt;br /&gt;
: Așadar, &amp;lt;math&amp;gt;|h| = 0&amp;lt;/math&amp;gt;, deci &amp;lt;math&amp;gt; H = O&amp;lt;/math&amp;gt;, adică triunghiul &amp;lt;math&amp;gt;A_1A_2A_3&amp;lt;/math&amp;gt; este echilateral.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=Gazeta_Matematic%C4%83&amp;diff=9522</id>
		<title>Gazeta Matematică</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=Gazeta_Matematic%C4%83&amp;diff=9522"/>
		<updated>2024-01-16T15:05:21Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Această pagină conține o listă cu numerele revistei &#039;&#039;[https://gmb.ssmr.ro/ Gazeta Matematică]&#039;&#039; care conțin articole/probleme cu autori membri ai [https://ssmr.cunbm.utcluj.ro/ Filialei Maramureș] a [https://ssmr.ro/ Societății de Științe Matematice din România].&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Anul&lt;br /&gt;
!Numărul &lt;br /&gt;
!Numărul problemei&lt;br /&gt;
!Clasa&lt;br /&gt;
!Domeniu&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;13&amp;quot; |2022&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|1 &lt;br /&gt;
| [[28247]]&lt;br /&gt;
|11&lt;br /&gt;
|Matrice&lt;br /&gt;
|-&lt;br /&gt;
| [[28250]]&lt;br /&gt;
|12&lt;br /&gt;
|integrala Riemann&lt;br /&gt;
|-&lt;br /&gt;
| [[28251]]&lt;br /&gt;
|12&lt;br /&gt;
|integrala Riemann&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
| [[S:L22.58]]&lt;br /&gt;
|10&lt;br /&gt;
| ecuație cu logaritmi&lt;br /&gt;
|-&lt;br /&gt;
|4 - [[Gazeta Matematică nr 4 2022|link]]&lt;br /&gt;
| [[28315]]&lt;br /&gt;
|10  &lt;br /&gt;
|numere complexe&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
| [[28338]]&lt;br /&gt;
|10&lt;br /&gt;
|numere complexe&lt;br /&gt;
afixe&lt;br /&gt;
|-&lt;br /&gt;
|6-7-8&lt;br /&gt;
| [[28354]]&lt;br /&gt;
|9&lt;br /&gt;
|vectori&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; |10 - [[Gazeta Matematică nr 10 2022|link]]&lt;br /&gt;
| [[28437]]&lt;br /&gt;
|11&lt;br /&gt;
|șir recurent&lt;br /&gt;
|-&lt;br /&gt;
|[[E:16379]]&lt;br /&gt;
|5&lt;br /&gt;
|numere naturale&lt;br /&gt;
|-&lt;br /&gt;
|[[E:16380]]&lt;br /&gt;
|5&lt;br /&gt;
|puteri &lt;br /&gt;
|-&lt;br /&gt;
|[[E:16382]]&lt;br /&gt;
|5&lt;br /&gt;
|puteri &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|11 &lt;br /&gt;
| [[E:16407]]&lt;br /&gt;
|5&lt;br /&gt;
|cub perfect&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[28450]]&lt;br /&gt;
|9&lt;br /&gt;
|progresii aritmetice&lt;br /&gt;
|-&lt;br /&gt;
|rowspan = &amp;quot;7&amp;quot; |2021&lt;br /&gt;
|rowspan = &amp;quot;3&amp;quot; |6-7-8 - [[Gazeta Matematică nr 6-7-8 din 2021|link]]&lt;br /&gt;
|[[E:15990]]&lt;br /&gt;
|5&lt;br /&gt;
|numere naturale&lt;br /&gt;
|-&lt;br /&gt;
| [[E:15991]]&lt;br /&gt;
|5&lt;br /&gt;
|numere naturale&lt;br /&gt;
|-&lt;br /&gt;
| [[E:15992]]&lt;br /&gt;
|5&lt;br /&gt;
|numere naturale&lt;br /&gt;
|-&lt;br /&gt;
|rowspan= &amp;quot;3&amp;quot; | 11&lt;br /&gt;
|[[28203]]&lt;br /&gt;
|12&lt;br /&gt;
|funcție primitivabilă&lt;br /&gt;
|-&lt;br /&gt;
|[[S:L21.287]]&lt;br /&gt;
|9&lt;br /&gt;
|puteri&lt;br /&gt;
|-&lt;br /&gt;
|[[S:E21.313]]&lt;br /&gt;
|8&lt;br /&gt;
|ecuație&lt;br /&gt;
|-&lt;br /&gt;
|rowspan= &amp;quot;1&amp;quot; | 12&lt;br /&gt;
|[[28208]]&lt;br /&gt;
|9&lt;br /&gt;
|vectori&lt;br /&gt;
|-&lt;br /&gt;
|rowspan =&amp;quot;5&amp;quot;|2020&lt;br /&gt;
|rowspan =&amp;quot;3&amp;quot;| 4 - [[Gazeta Matematică nr 4 2020|link]]&lt;br /&gt;
|[[15698|E:15698]]&lt;br /&gt;
|6&lt;br /&gt;
|pătrate perfecte&lt;br /&gt;
|-&lt;br /&gt;
|[[E:15694]]&lt;br /&gt;
|5&lt;br /&gt;
|teorema împărțirii cu rest&lt;br /&gt;
|-&lt;br /&gt;
|[[E:15695]]&lt;br /&gt;
|5&lt;br /&gt;
|numere naturale&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|[[E:15714]]&lt;br /&gt;
|6&lt;br /&gt;
|divizibilitate &lt;br /&gt;
probabilitate&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|[[27930]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; |2018&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; |4 - [[Gazeta Matematică nr 4 2018|link]]&lt;br /&gt;
| [[S:E18.128]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[S:E18.131]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[S:E18.131]]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2017&lt;br /&gt;
|6-7-8&lt;br /&gt;
|[[27401]]&lt;br /&gt;
|10&lt;br /&gt;
|inegalitate&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;10&amp;quot; |2015&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|1&lt;br /&gt;
|[[27024]]&lt;br /&gt;
|12&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[27020]]&lt;br /&gt;
|10&lt;br /&gt;
|coeficienți binomiali&lt;br /&gt;
|-&lt;br /&gt;
|2 - [[Gazeta Matematică nr 2 2015|link]]&lt;br /&gt;
|[[27036]]&lt;br /&gt;
|11&lt;br /&gt;
|ecuații funcționale&lt;br /&gt;
|-&lt;br /&gt;
|3 - [[Gazeta Matematică nr 2 2015|link]]&lt;br /&gt;
|[[27024]]&lt;br /&gt;
|12&lt;br /&gt;
|ecuații funcționale&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot;|9&lt;br /&gt;
|[[E:14892]]&lt;br /&gt;
|8&lt;br /&gt;
|patrulater inscriptibil&lt;br /&gt;
|-&lt;br /&gt;
|[[S:E15.208]]&lt;br /&gt;
|5&lt;br /&gt;
|sumă de numere consecutive &lt;br /&gt;
|-&lt;br /&gt;
|[[S:E15.239]]&lt;br /&gt;
|8&lt;br /&gt;
|Teorema lui Pitagora&lt;br /&gt;
|-&lt;br /&gt;
|[[S:L15.236]]&lt;br /&gt;
|12&lt;br /&gt;
|funcție primitivabilă&lt;br /&gt;
|-&lt;br /&gt;
|[[S:L15.231]]&lt;br /&gt;
|12&lt;br /&gt;
|limita unui șir&lt;br /&gt;
|-&lt;br /&gt;
|[[S:L15.228]]&lt;br /&gt;
|11&lt;br /&gt;
|limita unui șir&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|2014&lt;br /&gt;
|1&lt;br /&gt;
|[[14682]]&lt;br /&gt;
|6&lt;br /&gt;
|Geometrie&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| 2013&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|1&lt;br /&gt;
|[[26713]]&lt;br /&gt;
|11&lt;br /&gt;
|șiruri, limită&lt;br /&gt;
|-&lt;br /&gt;
|E:[[14440]]&lt;br /&gt;
|5&lt;br /&gt;
|pătrat perfect&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot;| 2012&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|4&lt;br /&gt;
|[[E:14336]]&lt;br /&gt;
|&lt;br /&gt;
|ecuație funcțională&lt;br /&gt;
|-&lt;br /&gt;
|[[E:14331]]&lt;br /&gt;
| 7 &amp;amp; 8&lt;br /&gt;
|numere prime&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|9 - [[Gazeta Matematică nr 9 2012|link]]&lt;br /&gt;
|E:[[14380]]&lt;br /&gt;
|5&lt;br /&gt;
|numere naturale&lt;br /&gt;
|-&lt;br /&gt;
|[[14383|E:14383]]&lt;br /&gt;
|6&lt;br /&gt;
|cmmdc &amp;amp; cmmmc&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;| 2011&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|7-8-9 - [[Gazeta Matematică nr 789 2011|link]]&lt;br /&gt;
|[[E:14223]]&lt;br /&gt;
|7&lt;br /&gt;
|rezolvarea triunghiului&lt;br /&gt;
|-&lt;br /&gt;
|[[E:14228]]&lt;br /&gt;
|7&lt;br /&gt;
|radicali&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2001_-_Huge_Control&amp;diff=6378</id>
		<title>2001 - Huge Control</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2001_-_Huge_Control&amp;diff=6378"/>
		<updated>2023-05-14T14:34:27Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Cifra de control a unui număr se obţine efectuând suma cifrelor sale, apoi suma cifrelor acestei sume etc. până se obţine o sumă formată dintr-o singură cifră. De exemplu, cifra de control a numărului 713 este 2. (7 + 1 + 3 = 11, 1 + 1 = 2).&lt;br /&gt;
&lt;br /&gt;
Un număr de tip Huge este un număr natural de maxim 1.000.000 de cifre.&lt;br /&gt;
&lt;br /&gt;
În fișierul hugecontrol.in se găsește memorat un număr N, de tip Huge. Calculati și afișati cifra de control a numărului.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește din fișierul de intrare hugecontrol.in numărul N, de tip Huge.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa în fișierul de ieșire hugecontrol.out numărul digit, reprezentând cifra de control a lui N, alături de un mesaj de validare a datelor introduse (&amp;quot;Input valid&amp;quot; sau &amp;quot;Input invalid&amp;quot; după caz).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
N este un număr cu proprietăți caracteristice tipului Huge.&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 713&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 2&lt;br /&gt;
==Explicație==&lt;br /&gt;
7 + 1 + 3 = 11, 1 + 1 = 2 &lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def is_valid_number(n):&lt;br /&gt;
    return n.isdigit() and len(n) &amp;lt;= 1000000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_control_digit(n):&lt;br /&gt;
    nr = 0&lt;br /&gt;
&lt;br /&gt;
    for c in n:&lt;br /&gt;
        nr = nr * 10 + int(c)&lt;br /&gt;
        nr %= 9&lt;br /&gt;
&lt;br /&gt;
    return 9 if nr == 0 else nr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;hugecontrol.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;hugecontrol.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        if not is_valid_number(n):&lt;br /&gt;
            print(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        control_digit = compute_control_digit(n)&lt;br /&gt;
        fout.write(str(control_digit))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aceste funcții aparțin unui program care primește un număr mare și verifică dacă este valid, apoi calculează și scrie într-un fișier cifra de control a numărului dat.&lt;br /&gt;
&lt;br /&gt;
`is_valid_number(n)` este o funcție care primește un șir de caractere `n` și returnează `True` dacă șirul este format din cifre și are lungimea mai mică sau egală cu un milion, altfel returnează `False`. Această funcție este utilizată pentru a verifica dacă numărul de intrare este valid.&lt;br /&gt;
&lt;br /&gt;
`compute_control_digit(n)` este o funcție care primește un șir de caractere `n` și calculează cifra de control a numărului dat. Algoritmul pentru a calcula cifra de control este următorul:&lt;br /&gt;
&lt;br /&gt;
# Se pornește cu valoarea 0 pentru variabila `nr`.&lt;br /&gt;
# Se parcurge fiecare caracter din șirul de intrare `n`.&lt;br /&gt;
# Pentru fiecare caracter, se multiplică `nr` cu 10 și se adaugă valoarea numerică a caracterului.&lt;br /&gt;
# Se face modulo 9 pentru a reduce `nr` la un număr între 0 și 8.&lt;br /&gt;
# Când toți caracterele sunt procesate, se returnează 9 dacă `nr` este egal cu 0, altfel se returnează valoarea din `nr`.&lt;br /&gt;
&lt;br /&gt;
În codul principal, `__name__ == &amp;quot;__main__&amp;quot;` asigură faptul că blocul de cod din interiorul lui este executat numai atunci când fișierul este rulat ca un script și nu ca modul importat.&lt;br /&gt;
&lt;br /&gt;
În interiorul blocului principal, fișierul &amp;quot;hugecontrol.in&amp;quot; este deschis și citit, iar primul rând este citit ca șirul de intrare `n`. Apoi, se verifică dacă numărul este valid folosind `is_valid_number(n)`. Dacă numărul nu este valid, se afișează mesajul &amp;quot;Input invalid&amp;quot; și programul se termină. Altfel, se afișează mesajul &amp;quot;Input valid&amp;quot; și se calculează cifra de control folosind `compute_control_digit(n)`. Această cifră de control este scrisă în fișierul &amp;quot;hugecontrol.out&amp;quot; folosind `fout.write(str(control_digit))`.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2553_-_Josephus&amp;diff=6377</id>
		<title>2553 - Josephus</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2553_-_Josephus&amp;diff=6377"/>
		<updated>2023-05-14T14:33:06Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Aceasta este o problemă foarte cunoscută atât în universul informatic, cât și în cel matematic!&lt;br /&gt;
&lt;br /&gt;
Legenda ne povestește că Josephus și alți n-1 soldați evrei se luptau cu trupele romane. Din nefericire pentru aceștia, au ajuns foarte curând încercuiți și doborâți numeric. Ei se hotărăsc rapid să nu se predea, dar nici să nu își ia de unii singuri viața și astfel le vine următoarea idee: se așează cu toții într-un cerc și își scriu pe rând pe frunte câte un număr, reprezentând indicativul fiecăruia (1, 2, …, n). Soldații decid ca soldatul cu numărul 1 să îl trimită în rai pe soldatul încă în viață din stânga sa (notat, în acest context, cu numărul 2), apoi următorul soldat în viață să repete aceeași acțiune până când nu va mai rămâne decât o singură persoană în viață.&lt;br /&gt;
&lt;br /&gt;
Josephus ar fi preferat să se predea. Pe ce poziție ar fi trebuit să se afle soldatul pentru a putea realiza acest lucru?&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va citi un singur număr natural nenul, n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Se va afișa un singur număr ce reprezintă poziția pe care Josephus trebuia să se afle pentru a rămâne în viață, alături de un mesaj de validare a datelor introduse (&amp;quot;Input valid&amp;quot;; se afișează &amp;quot;n trebuie să fie între i și 10^18&amp;quot; în caz contrar).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 ≤ n ≤ 1018;&lt;br /&gt;
* Se garantează că există o soluție pentru oricare n;&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 41&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 19&lt;br /&gt;
==Explicație==&lt;br /&gt;
1 ⇒ 2 &amp;lt;br&amp;gt;&lt;br /&gt;
3 ⇒ 4&amp;lt;br&amp;gt;&lt;br /&gt;
…&amp;lt;br&amp;gt;&lt;br /&gt;
39 ⇒ 40&amp;lt;br&amp;gt;&lt;br /&gt;
41 ⇒ 1&amp;lt;br&amp;gt;&lt;br /&gt;
3 ⇒ 5&amp;lt;br&amp;gt;&lt;br /&gt;
…&amp;lt;br&amp;gt;&lt;br /&gt;
39 ⇒ 41&amp;lt;br&amp;gt;&lt;br /&gt;
3 ⇒ 7&amp;lt;br&amp;gt;&lt;br /&gt;
11 ⇒ 15&amp;lt;br&amp;gt;&lt;br /&gt;
………&amp;lt;br&amp;gt;&lt;br /&gt;
19 ⇒ 35&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def calculate_exponent(n):&lt;br /&gt;
    exponent = 0&lt;br /&gt;
    save_n = n&lt;br /&gt;
    while save_n != 1:&lt;br /&gt;
        save_n //= 2&lt;br /&gt;
        exponent += 1&lt;br /&gt;
    return exponent&lt;br /&gt;
&lt;br /&gt;
def is_power_of_two(n):&lt;br /&gt;
    exponent = calculate_exponent(n)&lt;br /&gt;
    return (1 &amp;lt;&amp;lt; exponent) == n&lt;br /&gt;
&lt;br /&gt;
def calculate_result(n):&lt;br /&gt;
    exponent = calculate_exponent(n)&lt;br /&gt;
    if is_power_of_two(n):&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return ((n - (1 &amp;lt;&amp;lt; exponent)) &amp;lt;&amp;lt; 1) + 1&lt;br /&gt;
&lt;br /&gt;
def validate_n(n):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 10**18:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie să fie între i și 10^18&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    validate_n(n)&lt;br /&gt;
    print(calculate_result(n))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest program implementează trei funcții care lucrează împreună pentru a verifica dacă un număr întreg n este o putere a lui 2 și pentru a calcula un rezultat bazat pe n.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;calculate_exponent&amp;quot; primește un număr întreg n și calculează exponentul său în baza 2. Exponentul este calculat prin împărțirea repetată a lui n la 2 până când n ajunge la valoarea 1, numărul de împărțiri fiind exponentul.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;is_power_of_two&amp;quot; primește un număr întreg n și verifică dacă este o putere a lui 2, comparându-l cu 2 ridicat la exponentul calculat în funcția anterioară.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;calculate_result&amp;quot; primește un număr întreg n și calculează rezultatul bazat pe aceasta. Dacă n este o putere a lui 2, rezultatul va fi 1, altfel va fi calculat după o formulă dată.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;validate_n&amp;quot; primește un număr întreg n și verifică dacă se încadrează între 1 și 10^18 inclusiv. Dacă n nu se încadrează în această plajă, funcția va arunca o excepție &amp;quot;ValueError&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
În metoda &amp;quot;main&amp;quot;, se primește un număr întreg n de la utilizator, se validează și se calculează și se afișează rezultatul apelând funcția &amp;quot;calculate_result&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3223_-_Scobitoare&amp;diff=6376</id>
		<title>3223 - Scobitoare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3223_-_Scobitoare&amp;diff=6376"/>
		<updated>2023-05-14T14:32:27Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Lui Ion îi plac scobitorile. Norocul său a fost că black friday tocmai a venit și a cumpărat un număr infinit de scobitori (să zicem că o duce destul de bine). Ținând cont că are extrem de multe scobitori, el a vrut să se joace cu ele, așa că a creat un joc.&lt;br /&gt;
&lt;br /&gt;
La primul pas, el pune o singură scobitoare în mijlocul mesei. Începând cu al doilea pas, el pune câte o scobitoare la fiecare capăt liber al scobitorilor plasate până acum, astfel încât cele două scobitori sunt perpendiculare și mijlocul scobitorii noi se afla la vârful scobitorii vechi. Un vârf de scobitoare este liber dacă nu atinge o altă scobitoare.&lt;br /&gt;
&lt;br /&gt;
Determinați&lt;br /&gt;
: 1. Numărul de scobitori aflate pe masă la pasul N.&lt;br /&gt;
: 2. Numărul de scobitori care au fost adăugate la pasul N.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare scobitoare.in conține pe prima linie două numere: P, care va reprezenta cerința, și N, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire scobitoare.out va conține numărul cerut, iar consola va afișa mesajul de validare a datelor (&amp;quot;Date de intrare valide&amp;quot; sau &amp;quot;Date de intrare invalide&amp;quot;, în funcție de validitatea datelor).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 1000&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; scobitoare.in&lt;br /&gt;
: 2 197&lt;br /&gt;
; scobitoare.out&lt;br /&gt;
: 60&lt;br /&gt;
; Consolă&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def T(n):&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        return 1&lt;br /&gt;
    elif n == 2:&lt;br /&gt;
        return 3&lt;br /&gt;
    elif n == 3:&lt;br /&gt;
        return 7&lt;br /&gt;
    elif n == 4:&lt;br /&gt;
        return 11&lt;br /&gt;
    else:&lt;br /&gt;
        Puterea = 0&lt;br /&gt;
        PutereDeDoi = 1&lt;br /&gt;
        while PutereDeDoi &amp;lt; n:&lt;br /&gt;
            Puterea += 1&lt;br /&gt;
            PutereDeDoi *= 2&lt;br /&gt;
&lt;br /&gt;
        if PutereDeDoi == n:&lt;br /&gt;
            return (int(math.pow(2, 2 * Puterea + 1)) + 1) // 3&lt;br /&gt;
        else:&lt;br /&gt;
            PutereDeDoi = PutereDeDoi // 2&lt;br /&gt;
            return T(PutereDeDoi) + 2 * T(n - PutereDeDoi) + T(n - PutereDeDoi + 1) - 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 1000:&lt;br /&gt;
        return False&lt;br /&gt;
    else:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_input():&lt;br /&gt;
    with open(&amp;quot;scobitoare.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        p = int(f.readline())&lt;br /&gt;
        n = int(f.readline())&lt;br /&gt;
        if not validate_input(n):&lt;br /&gt;
            print(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
    return p, n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_output(output):&lt;br /&gt;
    with open(&amp;quot;scobitoare.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        g.write(str(output))&lt;br /&gt;
    print(&amp;quot;Date de intrare valide\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    inputs = read_input()&lt;br /&gt;
    if inputs:&lt;br /&gt;
        p, n = inputs&lt;br /&gt;
        if p == 1:&lt;br /&gt;
            output = T(n)&lt;br /&gt;
        else:&lt;br /&gt;
            output = T(n) - T(n - 1)&lt;br /&gt;
        write_output(output)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod este scris în limbajul Python și conține următoarele funcții:&lt;br /&gt;
&lt;br /&gt;
1. Funcția &amp;quot;T(n)&amp;quot; calculează valoarea funcției T definită recursiv după cum urmează: T(1) = 1, T(2) = 3, T(3) = 7, T(4) = 11, T(n) = 2*T(n-1) + T(n-2) + T(n-3) - 1 pentru n &amp;gt; 4. În cazul în care n este o putere a lui 2, se aplică o formulă alternativă care folosește funcția &amp;quot;pow&amp;quot; din biblioteca Python &amp;quot;math&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
2. Funcția &amp;quot;validate_input(n)&amp;quot; returnează &amp;quot;True&amp;quot; dacă n se află între 1 și 1000 și &amp;quot;False&amp;quot; altfel.&lt;br /&gt;
&lt;br /&gt;
3. Funcția &amp;quot;read_input()&amp;quot; citește din fișierul &amp;quot;scobitoare.in&amp;quot; două numere întregi: &amp;quot;p&amp;quot; și &amp;quot;n&amp;quot;. Funcția verifică dacă n este valid folosind funcția &amp;quot;validate_input(n)&amp;quot;. În caz contrar, scrie în consolă mesajul &amp;quot;Date de intrare invalide&amp;quot; și se termină.&lt;br /&gt;
&lt;br /&gt;
4. Funcția &amp;quot;write_output(output)&amp;quot; scrie valoarea &amp;quot;output&amp;quot; în fișierul &amp;quot;scobitoare.out&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
5. În blocul &amp;quot;if __name__ == &#039;__main__&#039;:&amp;quot;, funcția &amp;quot;read_input()&amp;quot; este apelată pentru a citi inputul. Dacă inputul este valid, se calculează valoarea lui &amp;quot;output&amp;quot; folosind funcția &amp;quot;T(n)&amp;quot; și se apelează funcția &amp;quot;write_output(output)&amp;quot; pentru a scrie outputul în fișierul &amp;quot;scobitoare.out&amp;quot;. În cazul în care p este diferit de 1, se calculează diferența dintre T(n) și T(n-1).&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1973_-_Hambar2&amp;diff=6375</id>
		<title>1973 - Hambar2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1973_-_Hambar2&amp;diff=6375"/>
		<updated>2023-05-14T14:29:31Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Enunț==&lt;br /&gt;
Prințesa Gîrcella este foarte frumoasă. Fiindcă a venit momentul să se mărite, foarte mulți feciori au venit să îi ceară mâna. Printre aceștia se află și Cavalerul de Aur, marele algoritmician. Gîrcella îl dorește pe cel mai inteligent, așa că le va pune o provocare. Grădina sa este o matrice pătratică binară (cu valori 0 sau 1), valorile 0 reprezintă teren liber iar valorile 1 reprezintă pomi. Cel ce va găsi suprafața dreptunghică de arie maximă ce conține doar valori 0, pe care va construi un hambar, va câștiga mâna frumoasei Gîrcella.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Ajutați-l pe Cavalerul de Aur să câștige această întrecere.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare hambar2.in conține pe prima linie numerele N și M, reprezentând dimensinunea matricei respectiv numărul de pomi, iar pe următoarele M linii se vor găsi două numere x și y, separate printr-un spațiu, reprezentând indicele liniei, respectiv al coloanei pe care se află un pom.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire hambar2.out va conține pe prima linie numărul S, reprezentând aria maximă a unei suprafețe dreptunghiulare.&lt;br /&gt;
În consolă se va afișa un mesaj de validare a datelor (&amp;quot;Input valid&amp;quot; sau instrucțiuni cu privire la n sau m).&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 ≤ N, M ≤ 1000&lt;br /&gt;
* Nu se vor afla 2 sau mai mulți pomi în același loc.&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; hambar2.in&lt;br /&gt;
: 5 5&lt;br /&gt;
: 1 3&lt;br /&gt;
: 2 1&lt;br /&gt;
: 2 5&lt;br /&gt;
: 5 1&lt;br /&gt;
: 5 5&lt;br /&gt;
; hambar2.out&lt;br /&gt;
: 12&lt;br /&gt;
; Consolă&lt;br /&gt;
: Input valid&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
nMAX = 1000&lt;br /&gt;
&lt;br /&gt;
def clear(stiva):&lt;br /&gt;
    while stiva:&lt;br /&gt;
        stiva.pop()&lt;br /&gt;
&lt;br /&gt;
def calculate_histogram(n, mat):&lt;br /&gt;
    h = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        for j in range(1, n+1):&lt;br /&gt;
            if not mat[i][j]:&lt;br /&gt;
                h[j] += 1&lt;br /&gt;
            else:&lt;br /&gt;
                h[j] = 0&lt;br /&gt;
&lt;br /&gt;
    return h&lt;br /&gt;
&lt;br /&gt;
def calculate_left_boundary(n, h):&lt;br /&gt;
    st = [0] * (n + 1)&lt;br /&gt;
    stiva = []&lt;br /&gt;
&lt;br /&gt;
    for j in range(1, n+1):&lt;br /&gt;
        while stiva and h[stiva[-1]] &amp;gt;= h[j]:&lt;br /&gt;
            stiva.pop()&lt;br /&gt;
&lt;br /&gt;
        if not stiva:&lt;br /&gt;
            st[j] = 0&lt;br /&gt;
        else:&lt;br /&gt;
            st[j] = stiva[-1]&lt;br /&gt;
&lt;br /&gt;
        stiva.append(j)&lt;br /&gt;
&lt;br /&gt;
    return st&lt;br /&gt;
&lt;br /&gt;
def calculate_right_boundary(n, h):&lt;br /&gt;
    dr = [0] * (n + 1)&lt;br /&gt;
    stiva = []&lt;br /&gt;
&lt;br /&gt;
    for j in range(n, 0, -1):&lt;br /&gt;
        while stiva and h[stiva[-1]] &amp;gt;= h[j]:&lt;br /&gt;
            stiva.pop()&lt;br /&gt;
&lt;br /&gt;
        if not stiva:&lt;br /&gt;
            dr[j] = n+1&lt;br /&gt;
        else:&lt;br /&gt;
            dr[j] = stiva[-1]&lt;br /&gt;
&lt;br /&gt;
        stiva.append(j)&lt;br /&gt;
&lt;br /&gt;
    return dr&lt;br /&gt;
&lt;br /&gt;
def calculate_max_rect(n, mat):&lt;br /&gt;
    arieMAX = 0&lt;br /&gt;
&lt;br /&gt;
    h = calculate_histogram(n, mat)&lt;br /&gt;
    st = calculate_left_boundary(n, h)&lt;br /&gt;
    dr = calculate_right_boundary(n, h)&lt;br /&gt;
&lt;br /&gt;
    for j in range(1, n+1):&lt;br /&gt;
        arieMAX = max(arieMAX, h[j] * (dr[j] - st[j] - 1))&lt;br /&gt;
&lt;br /&gt;
    return arieMAX&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, m):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 1000:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie să fie între 1 și 1000&amp;quot;)&lt;br /&gt;
        return 0&lt;br /&gt;
    if not 1 &amp;lt;= m &amp;lt;= 1000:&lt;br /&gt;
        raise ValueError(&amp;quot;m trebuie să fie între 1 și 1000&amp;quot;)&lt;br /&gt;
        return 0&lt;br /&gt;
    return 1&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;hambar2.in&#039;, &#039;r&#039;) as fin, open(&#039;hambar2.out&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        if validate_input(n, m):&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        mat = [[False] * (nMAX + 1) for _ in range(nMAX + 1)]&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y = map(int, fin.readline().split())&lt;br /&gt;
            mat[x][y] = True&lt;br /&gt;
&lt;br /&gt;
        fout.write(str(calculate_max_rect(n, mat)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest cod implementează o soluție pentru problema de a găsi cea mai mare suprafață a unui dreptunghi cu toate elementele sale nealbe într-o matrice dată de dimensiunea n x n. Mai precis, codul conține următoarele funcții:&lt;br /&gt;
&lt;br /&gt;
- Funcția &amp;quot;clear&amp;quot; golește conținutul unei stive date ca argument;&lt;br /&gt;
- Funcția &amp;quot;calculate_histogram&amp;quot; calculează histograma pentru matricea dată și returnează o listă de dimensiune n+1, unde primul element este 0 și următoarele elemente reprezintă înălțimea coloanelor corespunzătoare din matrice;&lt;br /&gt;
- Funcțiile &amp;quot;calculate_left_boundary&amp;quot; și &amp;quot;calculate_right_boundary&amp;quot; calculează limitele stângi, respectiv drepte ale dreptunghiurilor care conțin fiecare coloană din matricea dată și care au înălțimile date de histograma calculată anterior. Acestea returnează două liste de dimensiune n+1, unde primul și ultimul element sunt 0, iar restul elementelor reprezintă limitele stângi sau drepte corespunzătoare;&lt;br /&gt;
- Funcția &amp;quot;calculate_max_rect&amp;quot; calculează cea mai mare suprafață a unui dreptunghi cu toate elementele sale nealbe în matricea dată, folosind funcțiile &amp;quot;calculate_histogram&amp;quot;, &amp;quot;calculate_left_boundary&amp;quot; și &amp;quot;calculate_right_boundary&amp;quot;;&lt;br /&gt;
- Funcția &amp;quot;validate_input&amp;quot; verifică dacă valorile n și m sunt în intervalul [1, 1000] și generează o excepție în caz contrar.&lt;br /&gt;
&lt;br /&gt;
În secțiunea &amp;quot;if __name__ == &#039;__main__&#039;:&amp;quot; se deschide fișierul &amp;quot;hambar2.in&amp;quot; pentru citire și fișierul &amp;quot;hambar2.out&amp;quot; pentru scriere, se citește dimensiunea matricei și numărul de elemente albe din aceasta și se verifică dacă valorile introduse sunt valide. Dacă sunt, se construiește matricea folosind elementele citite și se apelează funcția &amp;quot;calculate_max_rect&amp;quot; pentru a calcula cea mai mare suprafață a unui dreptunghi cu toate elementele sale nealbe. Rezultatul este scris în fișierul &amp;quot;hambar2.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4211_-_ElimZTRec&amp;diff=5817</id>
		<title>4211 - ElimZTRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4211_-_ElimZTRec&amp;diff=5817"/>
		<updated>2023-05-03T07:17:52Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Scrieți funcția recursivă ElimZTRec care primind ca parametru un număr natural nenul n, returnează numărul obținut prin eliminarea eventualelor cifre de 0 de la sfârșitul lui n.&lt;br /&gt;
&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 2.147.000.000&lt;br /&gt;
* Numele funcției este ElimZTRec.&lt;br /&gt;
* Se recomandă utilizarea recursivității în rezolvarea problemei.&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;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt corecte.&amp;quot;, apoi pe un rând nou un mesaj dat în funcție de valoarea returnată de funcția ElimZTRec, reprezentând numărul cerut. În cazul în care numărul introdus depășește limitele date, se va afișa &amp;quot;Numarul introdus nu este valid.&amp;quot;, iar dacă numărul introdus nu este întreg, se va afișa &amp;quot;Nu ati introdus un numar intreg.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Exemplu 1==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti un numar natural intre 1 si 2147000000: 240&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt valide.&lt;br /&gt;
: Numarul fara zerouri la final este: 24&lt;br /&gt;
==Exemplu 2==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti un numar natural intre 1 si 2147000000: 123&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt valide.&lt;br /&gt;
: Numarul fara zerouri la final este: 123&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_n(n):&lt;br /&gt;
    if isinstance(n, int) and n &amp;gt;= 1 and n &amp;lt;= 2147000000:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def ElimZTRec(n):&lt;br /&gt;
    if n % 10 != 0:&lt;br /&gt;
        return n&lt;br /&gt;
    else:&lt;br /&gt;
        return ElimZTRec(n // 10)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = input(&amp;quot;Introduceti un numar natural intre 1 si 2147000000: &amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(n)&lt;br /&gt;
        if validate_n(n):&lt;br /&gt;
            result = ElimZTRec(n)&lt;br /&gt;
            print(&amp;quot;Datele introduse sunt valide.&amp;quot;)&lt;br /&gt;
            print(f&amp;quot;Numarul fara zerouri la final este: {result}&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Numarul introdus nu este valid.&amp;quot;)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Nu ati introdus un numar natural.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Funcția validate_n(n) verifică dacă valoarea argumentului n este un număr întreg pozitiv între 1 și 2147000000 (valoarea maximă pe 32 de biți). Dacă această condiție este îndeplinită, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția ElimZTRec(n) primește un număr natural n și elimină zerourile de la sfârșitul acestuia recursiv, până când ultima cifră a numărului este diferită de 0. În cazul în care ultima cifră a numărului este diferită de 0, funcția returnează valoarea inițială a numărului, altfel apelează funcția recursiv cu n împărțit la 10.&lt;br /&gt;
&lt;br /&gt;
În secțiunea if __name__ == &amp;quot;__main__&amp;quot;:, programul primește de la utilizator un număr natural, îl validează folosind funcția validate_n(n), apelează funcția ElimZTRec(n) pentru a elimina zerourile de la sfârșitul numărului și afișează rezultatul. Dacă numărul introdus de utilizator nu este valid, se afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4262_-_FiboRec&amp;diff=5816</id>
		<title>4262 - FiboRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4262_-_FiboRec&amp;diff=5816"/>
		<updated>2023-05-03T07:17:33Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Scrieți funcția recursivă cu antetul&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;def FiboRec(x, y)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
care primind ca parametri două numere întregi x și y, returnează 1 dacă x și y și sunt doi termeni consecutivi ai șirului Fibonacci, sau returnează 0 în caz contrar.&lt;br /&gt;
&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
* Primii zece termeni ai șirului Fibonacci sunt: 1,1,2,3,5,8,13,21,34,55.&lt;br /&gt;
* Dacă x și y sunt termeni consecutivi ai șirului Fibonacci, atunci trebuie ca x &amp;amp;les; y.&lt;br /&gt;
* Se recomandă utilizarea recursivității în rezolvarea problemei.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele x și y.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt corecte.&amp;quot;, apoi pe un rând nou un mesaj dat în funcție de valoarea returnată de funcția FiboRec, reprezentând numărul cerut. În cazul în care x &amp;amp;ges; y, se va afișa &amp;quot;Valorile introduse nu sunt valide.&amp;quot;, iar dacă numerele introduse nu sunt întregi, se va afișa &amp;quot;Valorile introduse nu sunt numere intregi.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Exemplu 1==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti valoarea lui x: 5&lt;br /&gt;
: Introduceti valoarea lui y: 8&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: Numerele 5 si 8 sunt consecutive in sirul Fibonacci.&lt;br /&gt;
==Exemplu 2==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti valoarea lui x: 5&lt;br /&gt;
: Introduceti valoarea lui y: 9&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: Numerele 5 si 9 nu sunt consecutive in sirul Fibonacci.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_FiboRec(x, y):&lt;br /&gt;
    if isinstance(x, int) and isinstance(y, int) and x &amp;lt;= y and y &amp;gt; 0:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def FiboRec(x, y):&lt;br /&gt;
    if x == y:&lt;br /&gt;
        return 1&lt;br /&gt;
    elif x &amp;gt; y or y &amp;lt; 1:&lt;br /&gt;
        return 0&lt;br /&gt;
    else:&lt;br /&gt;
        return FiboRec(y - x, x)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    x = input(&amp;quot;Introduceti valoarea lui x: &amp;quot;)&lt;br /&gt;
    y = input(&amp;quot;Introduceti valoarea lui y: &amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        x = int(x)&lt;br /&gt;
        y = int(y)&lt;br /&gt;
        if validate_FiboRec(x, y):&lt;br /&gt;
            result = FiboRec(x, y)&lt;br /&gt;
            print(&amp;quot;Datele introduse sunt corecte.&amp;quot;)&lt;br /&gt;
            if result == 1:&lt;br /&gt;
                print(f&amp;quot;Numerele {x} si {y} sunt consecutive in sirul Fibonacci.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(f&amp;quot;Numerele {x} si {y} nu sunt consecutive in sirul Fibonacci.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Valorile introduse nu sunt valide.&amp;quot;)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Valorile introduse nu sunt numere intregi.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Prima funcție, `validate_FiboRec(x, y)`, verifică dacă valorile `x` și `y` sunt numere întregi, dacă `x` este mai mic sau egal cu `y`, iar `y` este mai mare decât zero. Dacă toate condițiile sunt îndeplinite, funcția returnează `True`, altfel returnează `False`.&lt;br /&gt;
&lt;br /&gt;
A doua funcție, `FiboRec(x, y)`, folosește o abordare recursivă pentru a verifica dacă două numere întregi consecutive se află în șirul Fibonacci între `x` și `y`. Funcția verifică dacă `x` și `y` sunt egale și, în acest caz, returnează 1, pentru că orice număr este considerat a fi în șirul Fibonacci. Dacă `x` este mai mare decât `y` sau `y` este mai mic sau egal cu 0, funcția returnează 0. În celelalte cazuri, funcția calculează următorul număr din șirul Fibonacci folosind formula F(n) = F(n-1) + F(n-2) și continuă recursiv cu această formulă până când se ajunge la numărul `y-x`. &lt;br /&gt;
&lt;br /&gt;
În funcția principală, se citesc de la tastatură valorile `x` și `y`. Se încearcă conversia valorilor la numere întregi și se verifică dacă acestea sunt valide folosind funcția `validate_FiboRec`. Dacă valorile sunt valide, se apelează funcția `FiboRec` pentru a verifica dacă numerele sunt consecutive în șirul Fibonacci și se afișează un mesaj corespunzător. Dacă valorile `x` și `y` nu sunt valide, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4210_-_FCrescRec&amp;diff=5814</id>
		<title>4210 - FCrescRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4210_-_FCrescRec&amp;diff=5814"/>
		<updated>2023-05-03T07:16:22Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Scrieți funcția recursivă FCrescRec care primind ca parametru un număr natural n, returnează 1 dacă cifrele sale, începând cu cifra unităţilor sunt dispuse în ordine crescătoare, sau returnează 0 dacă n nu are cifrele în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
* 0 &amp;amp;les; n &amp;amp;les; 2.147.000.000&lt;br /&gt;
* Numele funcției este FCrescRec.&lt;br /&gt;
* Se recomandă utilizarea recursivității în rezolvarea problemei.&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;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt corecte.&amp;quot;, apoi pe un rând nou un mesaj în funcție de rezultatul funcției FCrescRec, care specifică dacă numărul are cifre crescătoare începând de la cifra unităților. În cazul în care numărul introdus depășește limitele date, se va afișa &amp;quot;Numarul introdus nu este valid.&amp;quot;, iar dacă numărul introdus nu este întreg, se va afișa &amp;quot;Nu ati introdus un numar intreg.&amp;quot;&lt;br /&gt;
: Notă: Crescător începând de la cifra unităților este un alt mod de a spune că cifrele numărului sunt descrescătoare.&lt;br /&gt;
== Exemplu 1==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti un numar intreg pozitiv: 4&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: Cifrele numarului 4 sunt in ordine crescatoare.&lt;br /&gt;
==Exemplu 2==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti un numar intreg pozitiv: 975311&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: Cifrele numarului 975311 sunt in ordine crescatoare.&lt;br /&gt;
==Exemplu 3==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti un numar intreg pozitiv: 43711&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: Cifrele numarului 43711 nu sunt in ordine crescatoare.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_n(n):&lt;br /&gt;
    if isinstance(n, int) and n &amp;gt;= 0 and n &amp;lt;= 2147000000:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def FCrescRec(n):&lt;br /&gt;
    if n &amp;lt; 10:&lt;br /&gt;
        return 1&lt;br /&gt;
    elif n % 10 &amp;gt; (n // 10) % 10:&lt;br /&gt;
        return 0&lt;br /&gt;
    else:&lt;br /&gt;
        return FCrescRec(n // 10)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = input(&amp;quot;Introduceti un numar intreg pozitiv: &amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(n)&lt;br /&gt;
        if validate_n(n):&lt;br /&gt;
            result = FCrescRec(n)&lt;br /&gt;
            print(&amp;quot;Datele introduse sunt corecte.&amp;quot;)&lt;br /&gt;
            if result == 1:&lt;br /&gt;
                print(f&amp;quot;Cifrele numarului {n} sunt in ordine crescatoare.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(f&amp;quot;Cifrele numarului {n} nu sunt in ordine crescatoare.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Numarul introdus nu este valid.&amp;quot;)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Nu ati introdus un numar intreg.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest cod implementează o funcție de validare a unui număr întreg n, validate_n(n), care verifică dacă numărul este de tip întreg, este mai mare sau egal cu 0 și mai mic sau egal cu 2147000000 (adica 2^31 - 1).&lt;br /&gt;
&lt;br /&gt;
Funcția FCrescRec(n) verifică recursiv dacă cifrele numărului întreg n sunt în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
În funcția principală (if __name__ == &amp;quot;__main__&amp;quot;:), utilizatorul este întâi întrebat să introducă un număr întreg pozitiv. Apoi se verifică dacă numărul introdus este valid folosind funcția de validare și, dacă este valid, se apelează funcția FCrescRec(n) pentru a verifica dacă cifrele sunt în ordine crescătoare sau nu. Se afișează apoi un mesaj corespunzător rezultatului verificării.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4208_-_ExistaImpareRec&amp;diff=5812</id>
		<title>4208 - ExistaImpareRec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4208_-_ExistaImpareRec&amp;diff=5812"/>
		<updated>2023-05-03T07:15:51Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Scrieți funcția recursivă ExistaImpareRec care primind ca parametru un număr natural n, returnează 1 dacă n conține cel puțin o cifră impară, sau returnează 0 dacă n conține doar cifre pare.&lt;br /&gt;
== Restricții și precizări == &lt;br /&gt;
* 0 ≤ n ≤ 2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt; - 1&lt;br /&gt;
* Numele funcției este ExistaImpareRec.&lt;br /&gt;
* Se recomandă utilizarea recursivității în rezolvarea problemei.&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;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt corecte.&amp;quot;, apoi pe un rând nou mesajul cerut în funcție de cifrele pare ale numărului introdus. În cazul în care numărul introdus depășește limitele date, se va afișa &amp;quot;Numarul introdus nu este valid.&amp;quot;, iar dacă numărul introdus nu este întreg, se va afișa &amp;quot;Nu ati introdus un numar intreg.&amp;quot;&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti un numar intreg intre 0 si 2^31 - 1: 240&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: Toate cifrele numarului 240 sunt pare.&lt;br /&gt;
==Exemplu 2==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti un numar intreg intre 0 si 2^31 - 1: 2134&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: Exista cel putin o cifra impara in numarul 2134.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_n(n):&lt;br /&gt;
    if isinstance(n, int) and n &amp;gt;= 0 and n &amp;lt;= 2**31 - 1:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def ExistaImpareRec(n):&lt;br /&gt;
    if n == 0:&lt;br /&gt;
        return 0&lt;br /&gt;
    elif n % 2 == 1:&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return ExistaImpareRec(n // 10)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = input(&amp;quot;Introduceti un numar intreg intre 0 si 2^31 - 1: &amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(n)&lt;br /&gt;
        if validate_n(n):&lt;br /&gt;
            result = ExistaImpareRec(n)&lt;br /&gt;
            print(&amp;quot;Datele introduse sunt corecte.&amp;quot;)&lt;br /&gt;
            if result == 1:&lt;br /&gt;
                print(f&amp;quot;Exista cel putin o cifra impara in numarul {n}.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(f&amp;quot;Toate cifrele numarului {n} sunt pare.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Numarul introdus nu este valid.&amp;quot;)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Nu ati introdus un numar intreg.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație==&lt;br /&gt;
* validate_n(n) - Verifică dacă n este un întreg pozitiv și se încadrează în intervalul 0 și 2^31 - 1. În caz contrar, returnează False.&lt;br /&gt;
* ExistaImpareRec(n) - Verifică recursiv dacă ultima cifră a lui n este impară. Dacă n este zero, returnează 0 pentru a indica că numărul nu conține cifre impare. În caz contrar, verifică dacă ultima cifră este impară. Dacă este impară, returnează 1. Altfel, apelează funcția cu n împărțit la 10, pentru a verifica următoarea cifră.&lt;br /&gt;
* if __name__ == &amp;quot;__main__&amp;quot;: - Acesta este punctul de intrare în program. În această secțiune, utilizatorul poate introduce un număr întreg n. Codul verifică dacă n este un număr întreg valid și se încadrează în intervalul specificat. În caz afirmativ, apelul ExistaImpareRec(n) și afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2283_-_Caraghios&amp;diff=5811</id>
		<title>2283 - Caraghios</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2283_-_Caraghios&amp;diff=5811"/>
		<updated>2023-05-03T07:14:33Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră un șir S de cifre nenule. O secvență a șirului S este o succesiune de cifre din S care apar pe poziții consecutive. Un număr n asociat unei secvențe din S este numărul în baza 10 care se formează cu toate cifrele din secvența respectivă, în ordinea în care apar în aceasta.&lt;br /&gt;
&lt;br /&gt;
Un număr n se numește caraghios dacă este egal cu pătratul sumei cifrelor lui n.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Dându-se un șir S de cifre nenule, să se determine câte dintre secvențele din S au numere asociate caraghioase.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare caraghios.in conține pe prima linie șirul S de cifre nenule.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire caraghios.out va conține pe prima linie numărul de secvențe din S care au asociate numere caraghioase.&lt;br /&gt;
În consolă se va afișa un mesaj de validare a datelor (&amp;quot;Input valid!&amp;quot; sau &amp;quot;Input invalid! Numărul de cifre trebuie să fie mai mic sau egal cu 1.000.000.&amp;quot; după caz).&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* Șirul S va conține maxim 1.000.000 de cifre&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; caraghios.in&lt;br /&gt;
: 28113&lt;br /&gt;
; caraghios.out&lt;br /&gt;
: 3&lt;br /&gt;
; Consolă&lt;br /&gt;
: Input valid!&lt;br /&gt;
==Explicație exemplu==&lt;br /&gt;
Toate secvențele lui S sunt: 2, 28, 281, 2811, 28113, 8, 81, 811, 8113, 1, 11, 113, 1, 13, 3&lt;br /&gt;
Există 3 secvențe care au asociate numere caraghioase: 81, 1, 1&lt;br /&gt;
: 81 = (8+1)*(8+1), 1 = 1*1, 1 = 1*1&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(input_str):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Verifică dacă input-ul are maxim 1.000.000 de cifre.&lt;br /&gt;
    :param input_str: șirul de caractere de verificat&lt;br /&gt;
    :return: True dacă input-ul este valid, False în caz contrar&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return len(input_str) &amp;lt;= 1000000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def count_caraghios(input_str):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calculează numărul de apariții a cifrei 1 într-un șir dat.&lt;br /&gt;
    :param input_str: șirul de caractere de analizat&lt;br /&gt;
    :return: numărul de apariții a cifrei 1, conform cerințelor specifice&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    nr = 0&lt;br /&gt;
    x = input_str[0]&lt;br /&gt;
    if x == &#039;1&#039;:&lt;br /&gt;
        nr += 1&lt;br /&gt;
    for y in input_str[1:]:&lt;br /&gt;
        if y == &#039;1&#039;:&lt;br /&gt;
            nr += 1&lt;br /&gt;
            if x == &#039;8&#039;:&lt;br /&gt;
                nr += 1&lt;br /&gt;
        x = y&lt;br /&gt;
    return nr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    input_file = &amp;quot;caraghios.in&amp;quot;&lt;br /&gt;
    output_file = &amp;quot;caraghios.out&amp;quot;&lt;br /&gt;
    with open(input_file, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        input_str = f.read().strip()&lt;br /&gt;
    if not validate_input(input_str):&lt;br /&gt;
        print(&amp;quot;Input invalid! Numărul de cifre trebuie să fie mai mic sau egal cu 1.000.000.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Input valid!&amp;quot;)&lt;br /&gt;
    nr = count_caraghios(input_str)&lt;br /&gt;
    with open(output_file, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(nr))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
În cadrul programului, se utilizează două funcții:&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input primește un șir de caractere input_str și returnează True dacă șirul are cel mult 1.000.000 de caractere.&lt;br /&gt;
&lt;br /&gt;
Funcția count_caraghios primește un șir de caractere input_str și calculează numărul de apariții a cifrei 1 în șir, respectând condiția specifică legată de cifra 8.&lt;br /&gt;
&lt;br /&gt;
În cadrul blocului main se deschide fișierul de intrare caraghios.in, se citește conținutul său într-un șir de caractere și se validează input-ul folosind funcția validate_input. Dacă input-ul este invalid, se afișează un mesaj corespunzător și programul se încheie. În caz contrar, se calculează numărul de apariții a cifrei 1 folosind funcția count_caraghios, iar rezultatul este scris în fișierul de ieșire caraghios.out.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1675_-_Calc&amp;diff=5809</id>
		<title>1675 - Calc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1675_-_Calc&amp;diff=5809"/>
		<updated>2023-05-03T07:12:34Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
La un concurs de informatică participă 2∙N elevi împărțiți în N echipe de câte 2. Echipa poate lucra în comun la problemele propuse doar dacă au calculatoarele în rețea. Laboratorul de informatică este unul special: are 2∙N calculatoare, distribuite pe două rânduri la distanță de un metru între ele (vertical și orizontal) și N cabluri de rețea de lungime un metru. Concursul se desfășoară pe mai multe zile și nu există două zile de concurs cu aceeași configurație a rețelei.&lt;br /&gt;
&lt;br /&gt;
Exemplu: pentru N=3, cei 6 elevi au fost împărțiți în 3 echipe, iar aranjarea rețelei în cele 3 zile de concurs este cea din figura de mai jos.&lt;br /&gt;
&lt;br /&gt;
Administratorul laboratorului vrea să memoreze în ordine lexicografică toate configurațiile folosite în zilele de concurs. Cablul orizontal se notează prin 0, iar cel vertical prin 1. Lucrând ordonat și eficient, pentru cele trei zile el își va nota valorile: 001, 100, respectiv 111. Se observă că o reprezentare de genul 000, 010, 011, 101 nu poate fi realizată.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cunoscând N, să se determine:&lt;br /&gt;
&lt;br /&gt;
Numărul de zile modulo 1000000007 în care se desfășoară concursul.&lt;br /&gt;
Configurațiile laboratorului în ziua X-1 și ziua X+1, cunoscând configurația zilei X.&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fişierul de intrare calc.in conţine pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2.&lt;br /&gt;
&lt;br /&gt;
Pe linia a doua vom avea numărul natural N.&lt;br /&gt;
&lt;br /&gt;
Pe linia a treia se va găsi un șir de N cifre binare, fără spații între ele, reprezentând configurația corectă realizată de administrator în ziua X.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă valoarea lui p este 1, se va rezolva numai punctul 1) din cerință.&lt;br /&gt;
În acest caz, în fişierul de ieşire calc.out se va scrie un singur număr natural Z reprezentând numărul de zile în care se desfășoară concursul pentru cele N echipe.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui p este 2, se va rezolva numai punctul 2) din cerință.&lt;br /&gt;
În acest caz, fişierul de ieşire calc.out va conține două linii. Pe prima linie se vor scrie N cifre binare, fără spații între ele, reprezentând configurația rețelei din ziua precedentă, iar pe a doua linie N cifre binare, fără spații între ele, reprezentând configurația din ziua următoare. Dacă în ziua precedentă nu există o configurație conform cerințelor problemei, se va scrie pe prima linie valoarea -1. Dacă în ziua următoare nu există o configurație conform cerințelor problemei, se va scrie pe a doua linie valoarea -1.&lt;br /&gt;
&lt;br /&gt;
Consola va afișa &amp;quot;Input valid&amp;quot; sau instrucțiuni de introducere a datelor.&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; N &amp;amp;les; 100000&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, iar pentru cerința a doua se acordă 80 de puncte.&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
; calc.in&lt;br /&gt;
&lt;br /&gt;
: 1&lt;br /&gt;
: 3&lt;br /&gt;
: 001&lt;br /&gt;
; calc.out&lt;br /&gt;
&lt;br /&gt;
: 3&lt;br /&gt;
; Consola&lt;br /&gt;
: Input valid&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
; calc.in&lt;br /&gt;
&lt;br /&gt;
: 2&lt;br /&gt;
: 3&lt;br /&gt;
: 001&lt;br /&gt;
; calc.out&lt;br /&gt;
&lt;br /&gt;
: -1&lt;br /&gt;
: 100&lt;br /&gt;
; Consola&lt;br /&gt;
: Input valid&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
MODULO = 1000 * 1000 * 1000 + 7&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_input():&lt;br /&gt;
    with open(&amp;quot;calc.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        tip = int(f.readline().strip())&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        s = f.readline().strip()&lt;br /&gt;
    return tip, n, s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_output(prev, next):&lt;br /&gt;
    with open(&amp;quot;calc.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{prev}\n{next}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_prev(s):&lt;br /&gt;
    n = len(s)&lt;br /&gt;
    prev = list(s)&lt;br /&gt;
    if s[n - 1] == &amp;quot;1&amp;quot; and s[n - 2] == &amp;quot;1&amp;quot;:&lt;br /&gt;
        prev[n - 1] = prev[n - 2] = &amp;quot;0&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        i = n - 2&lt;br /&gt;
        while i &amp;gt;= 0 and s[i] == &amp;quot;0&amp;quot;:&lt;br /&gt;
            i -= 1&lt;br /&gt;
        if i &amp;lt; 0:&lt;br /&gt;
            prev = &amp;quot;-1&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            prev[i] = &amp;quot;0&amp;quot;&lt;br /&gt;
            for j in range(i + 2, n):&lt;br /&gt;
                prev[j] = &amp;quot;1&amp;quot;&lt;br /&gt;
    return &amp;quot;&amp;quot;.join(prev)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_next(s):&lt;br /&gt;
    n = len(s)&lt;br /&gt;
    next = list(s)&lt;br /&gt;
    if s[n - 1] == &amp;quot;0&amp;quot; and s[n - 2] == &amp;quot;0&amp;quot;:&lt;br /&gt;
        next[n - 1] = next[n - 2] = &amp;quot;1&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        i = n - 1&lt;br /&gt;
        while i &amp;gt;= 0 and s[i] == &amp;quot;1&amp;quot;:&lt;br /&gt;
            i -= 1&lt;br /&gt;
        if i &amp;lt; 0:&lt;br /&gt;
            next = &amp;quot;-1&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            next[i - 1] = &amp;quot;1&amp;quot;&lt;br /&gt;
            next[i] = &amp;quot;0&amp;quot;&lt;br /&gt;
            oldi = i&lt;br /&gt;
            for j in range(i + 1, n):&lt;br /&gt;
                next[j] = &amp;quot;0&amp;quot;&lt;br /&gt;
            if (n - 1 - oldi) % 2 == 0:&lt;br /&gt;
                next[n - 1] = &amp;quot;1&amp;quot;&lt;br /&gt;
    return &amp;quot;&amp;quot;.join(next)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_fibonacci(n):&lt;br /&gt;
    if n &amp;lt;= 1:&lt;br /&gt;
        return 1&lt;br /&gt;
    a, b = 1, 1&lt;br /&gt;
    for i in range(2, n + 1):&lt;br /&gt;
        c = (a + b) % MODULO&lt;br /&gt;
        a, b = b, c&lt;br /&gt;
    return b&lt;br /&gt;
&lt;br /&gt;
def validate_input(tip: int, N: int, S: str) -&amp;gt; bool:&lt;br /&gt;
    if tip not in (1, 2):&lt;br /&gt;
        print(&amp;quot;tip trebuie sa fie 1 sau 2&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000):&lt;br /&gt;
        print(&amp;quot;N trebuie sa fie intre 1 si 100000&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if len(S) != N or not set(S).issubset({&#039;0&#039;, &#039;1&#039;}):&lt;br /&gt;
        print(&amp;quot;S trebuie sa fie un sir de N caractere &#039;0&#039; sau &#039;1&#039;&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    tip, n, s = read_input()&lt;br /&gt;
    if not validate_input(tip, n, s):&lt;br /&gt;
        exit(1)&lt;br /&gt;
    if tip == 1:&lt;br /&gt;
        result = compute_fibonacci(n)&lt;br /&gt;
        write_output(result, result)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        write_output(&amp;quot;-1&amp;quot;, &amp;quot;-1&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    prev = compute_prev(s)&lt;br /&gt;
    next = compute_next(s)&lt;br /&gt;
    write_output(prev, next)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
MODULO = 1000 * 1000 * 1000 + 7: definește valoarea modulo care va fi utilizată în funcția compute_fibonacci.&lt;br /&gt;
&lt;br /&gt;
def read_input(): definește o funcție care citește intrarea din fișierul &amp;quot;calc.in&amp;quot;. Prima linie a fișierului reprezintă tipul de operație de efectuat (tip), a doua linie reprezintă lungimea șirului (n), iar a treia linie reprezintă șirul (s). Funcția returnează valorile tipul, n și s.&lt;br /&gt;
&lt;br /&gt;
def write_output(prev, next): definește o funcție care scrie ieșirea în fișierul &amp;quot;calc.out&amp;quot;. Ieșirea constă din două linii: prev și next. Funcția primește două argumente: prev și next.&lt;br /&gt;
&lt;br /&gt;
def compute_prev(s): definește o funcție care primește un șir s ca intrare și returnează șirul anterior în ordinea lexicografică. Dacă șirul anterior nu există, funcția returnează -1.&lt;br /&gt;
&lt;br /&gt;
def compute_next(s): definește o funcție care primește un șir s ca intrare și returnează următorul șir în ordinea lexicografică. Dacă următorul șir nu există, funcția returnează -1.&lt;br /&gt;
&lt;br /&gt;
def compute_fibonacci(n): definește o funcție care calculează al n-lea număr Fibonacci folosind o abordare iterativă. Funcția returnează valoarea celui de-al n-lea număr Fibonacci.&lt;br /&gt;
&lt;br /&gt;
def validate_input(tip: int, N: int, S: str) -&amp;gt; bool: definește o funcție care validează intrarea. Verifică dacă valoarea tipului este 1 sau 2, dacă valoarea n se află între 1 și 100000 și dacă șirul s conține doar caracterele &amp;quot;0&amp;quot; și &amp;quot;1&amp;quot;. Dacă intrarea este validă, funcția returnează True; în caz contrar, returnează False.&lt;br /&gt;
&lt;br /&gt;
if name == &amp;quot;main&amp;quot;: este punctul de intrare principal al programului. Mai întâi, se citește intrarea folosind funcția read_input și se validează utilizând funcția validate_input. Dacă intrarea nu este validă, programul se încheie cu o eroare. Dacă tipul de operație (tip) este 1, se calculează al n-lea număr Fibonacci folosind funcția compute_fibonacci și se scrie ieșirea în fișierul &amp;quot;calc.out&amp;quot;. Dacă tipul de operație este 2, se calculează șirurile anterioare și următoare în ordinea lexicografică folosind funcțiile compute_prev și compute_next, respectiv, și se scrie ieșirea în fișierul &amp;quot;calc.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1124_-_Patrate&amp;diff=5808</id>
		<title>1124 - Patrate</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1124_-_Patrate&amp;diff=5808"/>
		<updated>2023-05-03T07:03:42Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Dându-se n, un număr natural, să se afle numărul de pătrate care au colţurile coordonate numere întregi cuprinse între 0 şi n inclusiv.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură un număr natural n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afişa pe ecran un număr natural, reprezentând numărul de pătrate formate cu cele (n+1)2 puncte. Deoarece rezultatul poate fi mare, se va afişa răspunsul modulo 666013. De asemenea, se afișează un mesaj de validare a datelor introduse (&amp;quot;Input valid&amp;quot; sau instructiuni de introducere pentru n).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 2.000.000.000&lt;br /&gt;
* Pentru teste în valoare de 30 de puncte, n ≤ 10&lt;br /&gt;
* Pentru teste în valoare de 75 de puncte, n ≤ 2.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;
: Input valid&lt;br /&gt;
: 6&lt;br /&gt;
==Explicație exemplu==&lt;br /&gt;
Pătratele ce se formează au colţurile:&lt;br /&gt;
&lt;br /&gt;
# (0, 0), (0, 1), (1, 1), (1, 0)&lt;br /&gt;
# (0, 1), (0, 2), (1, 2), (1, 1)&lt;br /&gt;
# (1, 0), (1, 1), (2, 1), (2, 0)&lt;br /&gt;
# (1, 1), (1, 2), (2, 2), (2, 1)&lt;br /&gt;
# (0, 0), (0, 2), (2, 2), (2, 0)&lt;br /&gt;
# (0, 1), (1, 2), (2, 1), (1, 0)&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 2000000000:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie sa fie intre 1 si 2.000.000.000&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_sum(n):&lt;br /&gt;
    validate_input(n)&lt;br /&gt;
    sol = 0&lt;br /&gt;
    mod = 666013&lt;br /&gt;
&lt;br /&gt;
    n %= mod&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        sol += (n - i) * (n - i) * (i + 1)&lt;br /&gt;
        sol %= mod&lt;br /&gt;
&lt;br /&gt;
    return sol&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    sol = calculate_sum(n)&lt;br /&gt;
    print(sol)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod definește trei funcții și o funcție principală:&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input(n) verifică dacă valoarea parametrului n este cuprinsă între 1 și 2.000.000.000, și aruncă o excepție ValueError dacă nu este.&lt;br /&gt;
&lt;br /&gt;
Funcția calculate_sum(n) primește un parametru n și calculează suma unei anumite formule matematice, bazată pe valoarea lui n și un număr constant (mod = 666013). Apoi, funcția returnează această sumă.&lt;br /&gt;
&lt;br /&gt;
Funcția main() citește un număr întreg de la tastatură, apelează funcția calculate_sum(n) pentru a calcula suma corespunzătoare, și apoi afișează rezultatul.&lt;br /&gt;
&lt;br /&gt;
Dacă acest script este rulat ca un program, atunci funcția main() este apelată.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2724_-_LSQ&amp;diff=5807</id>
		<title>2724 - LSQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2724_-_LSQ&amp;diff=5807"/>
		<updated>2023-05-03T07:02:14Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă o matrice binară (valori 0 și 1). Să se determine care este latura maximă a unui pătrat cu proprietatea că acesta are pe marginea sa doar valori 1.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare lsq.in conține pe prima linie numerele N și M, reprezentând numărul de linii și numărul de coloane ale matricei, apoi N linii, pe fiecare câte M valori 0 sau 1, neseparate prin niciun spațiu, reprezentând elementele matricei..&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire lsq.out va conține pe prima linie numărul L, reprezentând lungimea maximă a laturii unui pătrat ce conține doar 1 pe marginea sa. Consola va afișa un mesaj de validare a datelor (&amp;quot;Input valid&amp;quot; sau &amp;quot;Input invalid&amp;quot; după caz).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; N, M &amp;amp;les; 1000&lt;br /&gt;
* Se consideră pătrat și cel de latură 1 (conține doar un element).&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; lsq.in&lt;br /&gt;
&lt;br /&gt;
: 7 7&lt;br /&gt;
: 0000000&lt;br /&gt;
: 0111100&lt;br /&gt;
: 0101111&lt;br /&gt;
: 0100101&lt;br /&gt;
: 0111111&lt;br /&gt;
: 0000011&lt;br /&gt;
: 0000011&lt;br /&gt;
; lsq.out&lt;br /&gt;
&lt;br /&gt;
: 4&lt;br /&gt;
; Consola&lt;br /&gt;
: Input valid&lt;br /&gt;
==Explicație==&lt;br /&gt;
&lt;br /&gt;
0 0 0 0 0 0 0&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1 1 1 1&amp;lt;/b&amp;gt; 0 0&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 0 1 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 0 0 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 0 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1 1 1 1&amp;lt;/b&amp;gt; 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 0 0 0 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 0 0 0 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
Nmax = 1005&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_matrices(N, M, A):&lt;br /&gt;
    LDL = [[0] * M for _ in range(N)]&lt;br /&gt;
    CDL = [[0] * M for _ in range(N)]&lt;br /&gt;
    LRU = [[0] * M for _ in range(N)]&lt;br /&gt;
    CRU = [[0] * M for _ in range(N)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(M):&lt;br /&gt;
            if A[i][j] == 1:&lt;br /&gt;
                LDL[i][j] = 1 + LDL[i][j - 1] if j &amp;gt; 0 else 1&lt;br /&gt;
                CDL[i][j] = 1 + CDL[i - 1][j] if i &amp;gt; 0 else 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(N - 1, -1, -1):&lt;br /&gt;
        for j in range(M - 1, -1, -1):&lt;br /&gt;
            if A[i][j] == 1:&lt;br /&gt;
                LRU[i][j] = 1 + LRU[i][j + 1] if j &amp;lt; M - 1 else 1&lt;br /&gt;
                CRU[i][j] = 1 + CRU[i + 1][j] if i &amp;lt; N - 1 else 1&lt;br /&gt;
&lt;br /&gt;
    return LDL, CDL, LRU, CRU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_largest_square(N, M, A):&lt;br /&gt;
    LDL, CDL, LRU, CRU = compute_matrices(N, M, A)&lt;br /&gt;
    ans = 0&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(M):&lt;br /&gt;
            for L in range(min(LDL[i][j], CDL[i][j]), ans, -1):&lt;br /&gt;
                if L &amp;lt;= min(LRU[i - L + 1][j - L + 1], CRU[i - L + 1][j - L + 1]):&lt;br /&gt;
                    ans = L&lt;br /&gt;
                    break&lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def validate_input(n: int, m: int) -&amp;gt; bool:&lt;br /&gt;
    return 1 &amp;lt;= n &amp;lt;= 1000 and 1 &amp;lt;= m &amp;lt;= 1000&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;lsq.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;lsq.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        A = [list(map(int, fin.readline().strip())) for _ in range(N)]&lt;br /&gt;
        if not validate_input(N, M):&lt;br /&gt;
            print(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
        ans = find_largest_square(N, M, A)&lt;br /&gt;
        fout.write(str(ans) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest program calculează dimensiunea celui mai mare pătrat format numai din cifra 1 într-o matrice bidimensională dată. &lt;br /&gt;
&lt;br /&gt;
Funcția `compute_matrices` calculează patru matrici: `LDL`, `CDL`, `LRU`, `CRU`, fiecare fiind de aceeași dimensiune ca matricea de intrare `A`. Matricile `LDL` și `CDL` conțin lungimile celor mai lungi segmente consecutive de cifra 1 din stânga și, respectiv, de sus de fiecare celulă, iar matricile `LRU` și `CRU` conțin lungimile celor mai lungi segmente consecutive de cifra 1 din dreapta și, respectiv, de jos de fiecare celulă. &lt;br /&gt;
&lt;br /&gt;
În denumirea matricelor din funcția `compute_matrices`, primele trei litere reprezintă inițialele direcțiilor de la care începe numărătoarea segmentelor de cifra 1. Astfel, matricea `LDL` conține lungimile segmentelor consecutive de cifra 1 din stânga fiecărei celule, începând de la stânga și mergând spre dreapta, matricea `CDL` conține lungimile segmentelor consecutive de cifra 1 de sus fiecărei celule, începând de sus și mergând în jos, iar matricea `LRU` conține lungimile segmentelor consecutive de cifra 1 din dreapta fiecărei celule, începând de la dreapta și mergând spre stânga, iar matricea `CRU` conține lungimile segmentelor consecutive de cifra 1 de jos fiecărei celule, începând de jos și mergând în sus.&lt;br /&gt;
&lt;br /&gt;
Funcția `find_largest_square` parcurge fiecare celulă din matricea de intrare și, pentru fiecare celulă, verifică dacă poate fi colțul stânga-sus al unui pătrat și, în caz afirmativ, încearcă să-l mărească progresiv până la limita minimă dintre lungimile segmentelor de cifra 1 din matricile `LDL`, `CDL`, `LRU` și `CRU`. &lt;br /&gt;
&lt;br /&gt;
Funcția `validate_input` verifică dacă dimensiunile matricei de intrare sunt între 1 și 1000 inclusiv, iar blocul `if __name__ == &amp;quot;__main__&amp;quot;:` citește datele de intrare din fișierul &amp;quot;lsq.in&amp;quot;, validează dimensiunile matricei de intrare, calculează dimensiunea celui mai mare pătrat de cifra 1 și scrie rezultatul în fișierul &amp;quot;lsq.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2724_-_LSQ&amp;diff=5806</id>
		<title>2724 - LSQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2724_-_LSQ&amp;diff=5806"/>
		<updated>2023-05-03T07:01:09Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă o matrice binară (valori 0 și 1). Să se determine care este latura maximă a unui pătrat cu proprietatea că acesta are pe marginea sa doar valori 1.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare lsq.in conține pe prima linie numerele N și M, reprezentând numărul de linii și numărul de coloane ale matricei, apoi N linii, pe fiecare câte M valori 0 sau 1, neseparate prin niciun spațiu, reprezentând elementele matricei..&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire lsq.out va conține pe prima linie numărul L, reprezentând lungimea maximă a laturii unui pătrat ce conține doar 1 pe marginea sa. Consola va afișa un mesaj de validare a datelor (&amp;quot;Input valid&amp;quot; sau &amp;quot;Input invalid&amp;quot; după caz).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; N, M &amp;amp;les; 1000&lt;br /&gt;
* Se consideră pătrat și cel de latură 1 (conține doar un element).&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; lsq.in&lt;br /&gt;
&lt;br /&gt;
: 7 7&lt;br /&gt;
: 0000000&lt;br /&gt;
: 0111100&lt;br /&gt;
: 0101111&lt;br /&gt;
: 0100101&lt;br /&gt;
: 0111111&lt;br /&gt;
: 0000011&lt;br /&gt;
: 0000011&lt;br /&gt;
; lsq.out&lt;br /&gt;
&lt;br /&gt;
: 4&lt;br /&gt;
; Consola&lt;br /&gt;
: Input valid&lt;br /&gt;
==Explicație==&lt;br /&gt;
&lt;br /&gt;
0 0 0 0 0 0 0&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1 1 1 1&amp;lt;/b&amp;gt; 0 0&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 0 1 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 0 0 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 0 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1 1 1 1&amp;lt;/b&amp;gt; 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 0 0 0 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 0 0 0 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
Nmax = 1005&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_matrices(N, M, A):&lt;br /&gt;
    LDL = [[0] * M for _ in range(N)]&lt;br /&gt;
    CDL = [[0] * M for _ in range(N)]&lt;br /&gt;
    LRU = [[0] * M for _ in range(N)]&lt;br /&gt;
    CRU = [[0] * M for _ in range(N)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(M):&lt;br /&gt;
            if A[i][j] == 1:&lt;br /&gt;
                LDL[i][j] = 1 + LDL[i][j - 1] if j &amp;gt; 0 else 1&lt;br /&gt;
                CDL[i][j] = 1 + CDL[i - 1][j] if i &amp;gt; 0 else 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(N - 1, -1, -1):&lt;br /&gt;
        for j in range(M - 1, -1, -1):&lt;br /&gt;
            if A[i][j] == 1:&lt;br /&gt;
                LRU[i][j] = 1 + LRU[i][j + 1] if j &amp;lt; M - 1 else 1&lt;br /&gt;
                CRU[i][j] = 1 + CRU[i + 1][j] if i &amp;lt; N - 1 else 1&lt;br /&gt;
&lt;br /&gt;
    return LDL, CDL, LRU, CRU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_largest_square(N, M, A):&lt;br /&gt;
    LDL, CDL, LRU, CRU = compute_matrices(N, M, A)&lt;br /&gt;
    ans = 0&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(M):&lt;br /&gt;
            for L in range(min(LDL[i][j], CDL[i][j]), ans, -1):&lt;br /&gt;
                if L &amp;lt;= min(LRU[i - L + 1][j - L + 1], CRU[i - L + 1][j - L + 1]):&lt;br /&gt;
                    ans = L&lt;br /&gt;
                    break&lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def validate_input(n: int, m: int) -&amp;gt; bool:&lt;br /&gt;
    return 1 &amp;lt;= n &amp;lt;= 1000 and 1 &amp;lt;= m &amp;lt;= 1000&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;lsq.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;lsq.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        A = [list(map(int, fin.readline().strip())) for _ in range(N)]&lt;br /&gt;
        if not validate_input(N, M):&lt;br /&gt;
            print(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
        ans = find_largest_square(N, M, A)&lt;br /&gt;
        fout.write(str(ans) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest program calculează dimensiunea celui mai mare pătrat format numai din cifra 1 într-o matrice bidimensională dată. &lt;br /&gt;
&lt;br /&gt;
Funcția `compute_matrices` calculează patru matrici: `LDL`, `CDL`, `LRU`, `CRU`, fiecare fiind de aceeași dimensiune ca matricea de intrare `A`. Matricile `LDL` și `CDL` conțin lungimile celor mai lungi segmente consecutive de cifra 1 din stânga și, respectiv, de sus de fiecare celulă, iar matricile `LRU` și `CRU` conțin lungimile celor mai lungi segmente consecutive de cifra 1 din dreapta și, respectiv, de jos de fiecare celulă. &lt;br /&gt;
&lt;br /&gt;
În denumirea matricelor din funcția `compute_matrices`, primele trei litere reprezintă inițialele direcțiilor de la care începe numărătoarea segmentelor de cifra 1. Astfel, matricea `LDL` conține lungimile segmentelor consecutive de cifra 1 din stânga fiecărei celule, începând de la stânga și mergând spre dreapta, matricea `CDL` conține lungimile segmentelor consecutive de cifra 1 de sus fiecărei celule, începând de sus și mergând în jos, iar matricea `LRU` conține lungimile segmentelor consecutive de cifra 1 din dreapta fiecărei celule, începând de la dreapta și mergând spre stânga, iar matricea `CRU` conține lungimile segmentelor consecutive de cifra 1 de jos fiecărei celule, începând de jos și mergând în sus.&lt;br /&gt;
&lt;br /&gt;
Funcția `find_largest_square` parcurge fiecare celulă din matricea de intrare și, pentru fiecare celulă, verifică dacă poate fi colțul stânga-sus al unui pătrat și, în caz afirmativ, încearcă să-l mărească progresiv până la limita minimă dintre lungimile segmentelor de cifra 1 din matricile `LDL`, `CDL`, `LRU` și `CRU`. &lt;br /&gt;
&lt;br /&gt;
Funcția `validate_input` verifică dacă dimensiunile matricei de intrare sunt între 1 și 1000 inclusiv, iar funcția `main` citește datele de intrare din fișierul &amp;quot;lsq.in&amp;quot;, validează dimensiunile matricei de intrare, calculează dimensiunea celui mai mare pătrat de cifra 1 și scrie rezultatul în fișierul &amp;quot;lsq.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1735_-_divquery&amp;diff=5805</id>
		<title>1735 - divquery</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1735_-_divquery&amp;diff=5805"/>
		<updated>2023-05-03T06:54:54Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un vector indexat de la 1 cu n elemente numere naturale. Să se răspundă la q întrebări de forma x y, cu semnificația: “Care este cel mai mare divizor comun al elementelor cu indici cuprinși între x și y, inclusiv?”&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare divquery.in conține pe prima linie numerele n și q, pe a doua linie cele n numere naturale ale vectorului, iar de la linia 3 începând, q linii, pe fiecare aflându-se doua numere x y, reprezentând întrebările.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire divquery.out va conține q linii, pe fiecare linie i aflându-se răspunsul la întrebarea i. În consolă se va afișa un mesaj de validare a datelor (&amp;quot;Datele de intrare sunt valide!&amp;quot; sau &amp;quot;Datele de intrare nu sunt valide!&amp;quot; după caz).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 100.000&lt;br /&gt;
* 1 &amp;amp;les; ai &amp;amp;les; 100.000&lt;br /&gt;
* 1 &amp;amp;les; q &amp;amp;les; 1.000.000&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; divquery.in&lt;br /&gt;
&lt;br /&gt;
: 5 4&lt;br /&gt;
: 1 3 18 2 3&lt;br /&gt;
: 1 5&lt;br /&gt;
: 2 3&lt;br /&gt;
: 3 4&lt;br /&gt;
: 2 4&lt;br /&gt;
; divquery.out&lt;br /&gt;
&lt;br /&gt;
: 1&lt;br /&gt;
: 3&lt;br /&gt;
: 2&lt;br /&gt;
: 1&lt;br /&gt;
; Consola&lt;br /&gt;
: Datele de intrare sunt valide!&lt;br /&gt;
==Explicație exemplu==&lt;br /&gt;
În intervalul [1,5] cmmdc-ul este 1&lt;br /&gt;
În intervalul [2,3] cmmdc-ul este 3&lt;br /&gt;
În intervalul [3,4] cmmdc-ul este 2&lt;br /&gt;
În intervalul [2,4] cmmdc-ul este 1&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def cmmdc(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        r = a % b&lt;br /&gt;
        a = b&lt;br /&gt;
        b = r&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def read_input(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as fin:&lt;br /&gt;
        n, q = map(int, fin.readline().split())&lt;br /&gt;
        a = list(map(int, fin.readline().split()))&lt;br /&gt;
        queries = []&lt;br /&gt;
        for _ in range(q):&lt;br /&gt;
            x, y = map(int, fin.readline().split())&lt;br /&gt;
            queries.append((x, y))&lt;br /&gt;
    return n, a, queries&lt;br /&gt;
&lt;br /&gt;
def compute_logs(n):&lt;br /&gt;
    logs = [0] * (n+1)&lt;br /&gt;
    for i in range(2, n+1):&lt;br /&gt;
        logs[i] = 1 + logs[i//2]&lt;br /&gt;
    return logs&lt;br /&gt;
&lt;br /&gt;
def compute_sparse_table(a):&lt;br /&gt;
    n = len(a)&lt;br /&gt;
    logs = compute_logs(n)&lt;br /&gt;
    st = [[0]*n for _ in range(logs[n]+1)]&lt;br /&gt;
    st[0] = a&lt;br /&gt;
    for i in range(1, logs[n]+1):&lt;br /&gt;
        for j in range(n-(1&amp;lt;&amp;lt;i)+1):&lt;br /&gt;
            st[i][j] = cmmdc(st[i-1][j], st[i-1][j+(1&amp;lt;&amp;lt;(i-1))])&lt;br /&gt;
    return st, logs&lt;br /&gt;
&lt;br /&gt;
def process_queries(a, queries, st, logs):&lt;br /&gt;
    results = []&lt;br /&gt;
    for x, y in queries:&lt;br /&gt;
        dif = y - x + 1&lt;br /&gt;
        l = logs[dif]&lt;br /&gt;
        dif = dif - (1 &amp;lt;&amp;lt; l)&lt;br /&gt;
        res = cmmdc(st[l][x-1], st[l][x-1+dif])&lt;br /&gt;
        results.append(res)&lt;br /&gt;
    return results&lt;br /&gt;
&lt;br /&gt;
def write_output(filename, results):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as fout:&lt;br /&gt;
        for res in results:&lt;br /&gt;
            fout.write(str(res) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, a, q):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= x &amp;lt;= 100000 for x in a):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= x &amp;lt;= 1000000 for x in q):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    n, a, queries = read_input(&#039;divquery.in&#039;)&lt;br /&gt;
    if not validate_input(n, a, queries):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu sunt valide!&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare sunt valide!&amp;quot;)&lt;br /&gt;
    st, logs = compute_sparse_table(a)&lt;br /&gt;
    results = process_queries(a, queries, st, logs)&lt;br /&gt;
    write_output(&#039;divquery.out&#039;, results)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod este o implementare a unei soluții pentru problema &amp;quot;DivQuery&amp;quot;, care se ocupă cu determinarea celui mai mare divizor comun dintr-un interval dat dintr-un șir de numere.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;cmmdc(a, b)&amp;quot; calculează cel mai mare divizor comun dintre două numere folosind algoritmul Euclid.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;read_input(filename)&amp;quot; citește datele de intrare dintr-un fișier și returnează numărul de elemente din șir (n), lista cu elementele (a) și o listă cu perechi de numere (queries), reprezentând intervalele pentru care trebuie calculat cel mai mare divizor comun.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;compute_logs(n)&amp;quot; calculează logaritmul în baza 2 pentru numerele de la 2 la n și returnează o listă cu valorile obținute. Aceste valori sunt utilizate pentru a determina numărul de niveluri din tabelul rar.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;compute_sparse_table(a)&amp;quot; construiește un tabel rar (sparse table) pentru șirul de numere dat (a). Tabelul este reprezentat ca o matrice (st) cu (logs[n]+1) niveluri și n coloane. Primul nivel al matricei conține elementele din șir, iar fiecare nivel următor se construiește pe baza nivelului precedent. Matricea este construită astfel încât pentru orice subinterval din șir se poate calcula cel mai mare divizor comun folosind două valori din tabelul rar.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;process_queries(a, queries, st, logs)&amp;quot; calculează cel mai mare divizor comun pentru fiecare interval din lista de intervale (queries) folosind tabela rară și returnează o listă cu rezultatele obținute.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;write_output(filename, results)&amp;quot; scrie rezultatele într-un fișier de ieșire.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;validate_input(n, a, q)&amp;quot; verifică dacă datele de intrare sunt valide, adică numărul de elemente din șir să fie între 1 și 100000, elementele din șir să fie între 1 și 100000, iar intervalele să fie între 1 și 1000000.&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;quot;if name == &#039;main&#039;:&amp;quot; este partea principală din cod care apelează celelalte funcții pentru a rezolva problema și afișează un mesaj de eroare în cazul în care datele de intrare nu sunt valide.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1461_-_Meteoriti&amp;diff=5804</id>
		<title>1461 - Meteoriti</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1461_-_Meteoriti&amp;diff=5804"/>
		<updated>2023-05-03T06:52:16Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Din cauza blestemelor dușmanilor, asupra plantației de ‘noledge a vrăjitorului Arpsod s-a năpustit o ploaie de…meteoriți. Plantația vrăjitorului e foarte bine delimitată: aceasta are forma unei matrice cu N linii și M coloane, iar în fiecare celulă era plantat câte un fir de ‘noledge. Din motive clare de răzbunare, dușmanii nu s-au mulțumit cu o singură ploaie, astfel, pe plantația vrăjitorului au căzut meteoriți în mai multe reprize. La fiecare repriză, pe fiecare celulă a unui dreptunghi bine delimitat, au căzut exact C meteoriți. După ce ploaia s-a oprit, pe fiecare celulă se afla un “bloc” de piatră de înălțime egală cu numărul meteoriților căzuți în acea celulă. Arpsod, foarte furios, a luat următoarea decizie: va construi un laborator exact peste meteoriții căzuți, de unde își va pedepsi dușmanii. El a hotărât că cel mai bun amplasament pentru acest laborator este la înălțime maximă. Totodată, el își dorește ca laboratorul lui să aibă o suprafață cât mai mare.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Deoarece Arpsod şi arhitectul său, Ierdnac, sunt prea ocupaţi să pregătească schița viitorului laborator, vă roagă pe voi să determinați aria maximă a unei suprafețe cu celule învecinate, de înălțime maximă precum și numărul de fire de ‘noledge rămase neatinse după căderea meteoriților ( poate au ratat vreunu’ ! ).&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Pe prima linie a fișierului meteoriti.in se află trei numere naturale separate prin spațiu: N și M, reprezentând dimensiunile plantației și R, reprezentând numărul de reprize de meteoriți. Pe următoarele R linii se vor afla cinci valori separate prin spațiu: r1 c1 r2 c2 C, unde r1 c1 reprezintă coordonatele colțului stânga sus ( linie coloană ) iar r2 c2 coordonatele colțului dreapta jos ( linie coloană ) ale dreptiunghiului pe care vor cădea meteoriți iar C reprezintă numărul de meteoriți ce vor cădea pe fiecare celulă din cele delimitate.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
În fișierul meteoriti.out se va scrie, pe o singură linie, separate prin spațiu, aria maximă a unei suprafețe de înălțime maximă, formată numai din celule vecine respectiv numărul de fire de ‘noledge neafectate de meteoriți.&lt;br /&gt;
În consolă se va afișa un mesaj de validare a datelor (&amp;quot;Input valid&amp;quot; sau &amp;quot;Input invalid&amp;quot; după caz).&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 4 ≤ N, M ≤ 2.000&lt;br /&gt;
* 1 ≤ R ≤ 100.000&lt;br /&gt;
* 1 ≤ r1 ≤ r2 ≤ N&lt;br /&gt;
* 1 ≤ c1 ≤ c2 ≤ M&lt;br /&gt;
* 1 ≤ C ≤ 20.000&lt;br /&gt;
* Două celule se consideră vecine dacă au cel puțin o latură comună.&lt;br /&gt;
* Înălțimea inițială a celulelor se consideră 0.&lt;br /&gt;
* Se garantează că pentru 30% din teste 4 ≤ N, M ≤ 300 și 1 ≤ R ≤ 300&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerinţe se acordă 80% din punctajul pe testul respectiv iar pentru rezolvarea corectă a celei de-a doua cerinţe se acordă 20% din punctajul pe testul respectiv&lt;br /&gt;
* Fișierul de ieșire TREBUIE să conțină exact DOUĂ valori chiar dacă doriți să rezolvați o singură cerință din cele două&lt;br /&gt;
* Dacă îi veți da răspunsul corect vrăjitorului, acesta vă va primi și pe voi prin laboratorul său.&lt;br /&gt;
* NU este bine să îl supărați pe vrăjitor!&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; meteoriti.in&lt;br /&gt;
: 5 6 7&lt;br /&gt;
: 2 2 4 3 1&lt;br /&gt;
: 4 4 4 6 2&lt;br /&gt;
: 1 5 4 6 1&lt;br /&gt;
: 2 5 3 6 1&lt;br /&gt;
: 2 3 4 3 1&lt;br /&gt;
: 5 1 5 3 3&lt;br /&gt;
: 4 2 4 2 1&lt;br /&gt;
&lt;br /&gt;
; meteoriti.out&lt;br /&gt;
: 3 12&lt;br /&gt;
; Consolă&lt;br /&gt;
: Input valid&lt;br /&gt;
==Explicație==&lt;br /&gt;
Matricea după meteoriţi:&lt;br /&gt;
0 0 0 0 1 1&lt;br /&gt;
0 1 2 0 2 2&lt;br /&gt;
0 1 2 0 2 2&lt;br /&gt;
0 2 2 2 3 3&lt;br /&gt;
3 3 3 0 0 0&lt;br /&gt;
&lt;br /&gt;
Înălțimea maximă este 3 iar aria maximă a unei suprafețe de înălțime 3 este tot 3&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
nmax = 2*10**3&lt;br /&gt;
# liste care stochează schimbările de linie și coloană pentru a putea naviga în matricea 2D a meteoritelor din program&lt;br /&gt;
dl = [-1, 0, 1, 0]&lt;br /&gt;
dc = [0, 1, 0, -1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def is_valid(n, m, k):&lt;br /&gt;
    if not(4 &amp;lt;= n &amp;lt;= 2000) or not(4 &amp;lt;= m &amp;lt;= 2000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not(1 &amp;lt;= k &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(k):&lt;br /&gt;
        r1, c1, r2, c2, x = meteorites[i]&lt;br /&gt;
        if not(1 &amp;lt;= r1 &amp;lt;= r2 &amp;lt;= n) or not(1 &amp;lt;= c1 &amp;lt;= c2 &amp;lt;= m):&lt;br /&gt;
            return False&lt;br /&gt;
        if not(1 &amp;lt;= x &amp;lt;= 20000):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def build():&lt;br /&gt;
    global a&lt;br /&gt;
    for j in range(m):&lt;br /&gt;
        for i in range(1, n):&lt;br /&gt;
            a[i][j] += a[i-1][j]&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(1, m):&lt;br /&gt;
            a[i][j] += a[i][j-1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def inside(x, y):&lt;br /&gt;
    return (0 &amp;lt;= x &amp;lt; n) and (0 &amp;lt;= y &amp;lt; m)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fill(i, j, hmax):&lt;br /&gt;
    global was_here&lt;br /&gt;
    q = [(i, j)]&lt;br /&gt;
    was_here[i][j] = True&lt;br /&gt;
    area = 1&lt;br /&gt;
    while q:&lt;br /&gt;
        f1, f2 = q.pop(0)&lt;br /&gt;
        for p in range(4):&lt;br /&gt;
            iv, jv = f1+dl[p], f2+dc[p]&lt;br /&gt;
            if inside(iv, jv) and a[iv][jv] == hmax and not was_here[iv][jv]:&lt;br /&gt;
                area += 1&lt;br /&gt;
                was_here[iv][jv] = True&lt;br /&gt;
                q.append((iv, jv))&lt;br /&gt;
    return area&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def solve():&lt;br /&gt;
    global was_here&lt;br /&gt;
    hmax, amax, area0 = 0, 0, 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if a[i][j] &amp;gt;= hmax and not was_here[i][j]:&lt;br /&gt;
                area = fill(i, j, a[i][j])&lt;br /&gt;
                if a[i][j] == hmax:&lt;br /&gt;
                    amax = max(amax, area)&lt;br /&gt;
                else:&lt;br /&gt;
                    amax = area&lt;br /&gt;
                hmax = max(hmax, a[i][j])&lt;br /&gt;
            if not a[i][j]:&lt;br /&gt;
                area0 += 1&lt;br /&gt;
    with open(&#039;meteoriti.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{amax} {area0}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__==&amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&#039;meteoriti.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n, m, k = map(int, f.readline().split())&lt;br /&gt;
        if not is_valid(n,m,k):&lt;br /&gt;
            print(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
        a = [[0] * (nmax + 1) for _ in range(nmax + 1)]&lt;br /&gt;
        was_here = [[False] * (nmax + 1) for _ in range(nmax + 1)]&lt;br /&gt;
        for i in range(k):&lt;br /&gt;
            r1, c1, r2, c2, x = map(int, f.readline().split())&lt;br /&gt;
            r1, r2 = r1 - 1, r2 - 1&lt;br /&gt;
            c1, c2 = c1 - 1, c2 - 1&lt;br /&gt;
            a[r1][c1] += x&lt;br /&gt;
            a[r1][c2 + 1] -= x&lt;br /&gt;
            a[r2 + 1][c1] -= x&lt;br /&gt;
            a[r2 + 1][c2 + 1] += x&lt;br /&gt;
    build()&lt;br /&gt;
    solve()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest program prelucrează date de intrare din fișierul &amp;quot;meteoriti.in&amp;quot;, verifică dacă datele de intrare sunt valide și determină cea mai mare zonă de teren afectată de meteorit și numărul total de zone afectate într-un teren reprezentat prin matricea a. &lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;is_valid&amp;quot; verifică dacă dimensiunile matricei și numărul de evenimente sunt în intervalul specificat și dacă coordonatele și intensitățile meteoritilor sunt, de asemenea, în intervalul specificat.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;build&amp;quot; construiește matricea a prin adunarea sumei în direcția verticală și orizontală, astfel încât a[i][j] să conțină suma de la (0,0) la (i,j) în matricea de intrare.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;inside&amp;quot; verifică dacă coordonatele sunt în interiorul matricei.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;fill&amp;quot; utilizează o parcurgere BFS (Breadth-First-Search) pentru a găsi cea mai mare zonă continuă de teren cu aceeași înălțime în jurul unui punct dat din matricea a. Aceasta returnează numărul de celule din zona respectivă.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;solve&amp;quot; utilizează funcția &amp;quot;fill&amp;quot; pentru a căuta zonele de teren cu aceeași înălțime și pentru a determina cea mai mare zonă de teren afectată de meteorit și numărul total de zone afectate. Rezultatele sunt afișate în fișierul &amp;quot;meteoriti.out&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
În funcția principală, datele de intrare sunt citite din fișierul &amp;quot;meteoriti.in&amp;quot;, verificate și prelucrate prin funcțiile &amp;quot;build&amp;quot; și &amp;quot;solve&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1248_-_carti2&amp;diff=5803</id>
		<title>1248 - carti2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1248_-_carti2&amp;diff=5803"/>
		<updated>2023-05-03T06:47:31Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Un filipinez cultivat are X cărți pe care dorește să le vândă. Pentru aceasta, el merge pe strada Plopilor fără soț unde se află n case. Acesta știe că în fiecare dintre cele n case se vor vinde un număr de cărți.&lt;br /&gt;
&lt;br /&gt;
Filipinezul cultivat începe să vândă de la o casă a și trece pe la toate casele succesive până când nu mai are cărți de vândut.&lt;br /&gt;
&lt;br /&gt;
Determinați intervalul minim lexicografic [a, b] între care filipinezul să-și vândă cărțile, astfel încât să vândă un număr maxim de carți, mai mic sau egal cu X&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare carti2.in conține pe prima linie numerele n și X, iar pe a doua linie n numere naturale separate prin spații reprezntând numărul de cărți pe care le va vinde la fiecare casă.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire carti2.out va conține pe prima linie numerele a și b, reprezentând minim lexicografic al numerelor caselor pentru care numărul de cărți maxim este vândut.&lt;br /&gt;
În consolă se va afișa un mesaj de validare a datelor (&amp;quot;Input valid&amp;quot; sau ValueError cu un mesaj de corectare a datelor).&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* 1 ≤ X ≤ 1.000.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&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; carti2.in&lt;br /&gt;
: 5 9&lt;br /&gt;
: 1 2 3 4 5&lt;br /&gt;
; carti2.out&lt;br /&gt;
: 2 4&lt;br /&gt;
; Consolă&lt;br /&gt;
: Input valid&lt;br /&gt;
==Explicație==&lt;br /&gt;
Intervalul [2, 4], deoarece 2 + 3 + 4 = 9&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
Inf = 0x3f3f3f3f&lt;br /&gt;
&lt;br /&gt;
sys.stdin = open(&#039;carti2.in&#039;, &#039;r&#039;)&lt;br /&gt;
sys.stdout = open(&#039;carti2.out&#039;, &#039;w&#039;)&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, x):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 100000:&lt;br /&gt;
        raise ValueError(&amp;quot;Valoare invalidă pentru n. Trebuie să fie între 1 și 100000.&amp;quot;)&lt;br /&gt;
    if not 1 &amp;lt;= x &amp;lt;= 1000000000:&lt;br /&gt;
        raise ValueError(&amp;quot;Valoare invalidă pentru x. Trebuie să fie între 1 și 1000000000.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def read_input():&lt;br /&gt;
    n, x = map(int, input().split())&lt;br /&gt;
    validate_input(n, x)&lt;br /&gt;
    print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
    sp = [0] * (n + 1)&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        y = int(input())&lt;br /&gt;
        sp[i] = sp[i-1] + y&lt;br /&gt;
    return n, x, sp&lt;br /&gt;
&lt;br /&gt;
def CautBin(x, poz, n, sp):&lt;br /&gt;
    st = poz&lt;br /&gt;
    dr = n&lt;br /&gt;
    PozCautata = 0&lt;br /&gt;
    while st &amp;lt;= dr:&lt;br /&gt;
        mij = (st + dr) // 2&lt;br /&gt;
        if sp[mij] - sp[poz-1] &amp;lt;= x:&lt;br /&gt;
            PozCautata = mij&lt;br /&gt;
            st = mij + 1&lt;br /&gt;
        elif sp[mij] - sp[poz-1] &amp;gt; x:&lt;br /&gt;
            dr = mij - 1&lt;br /&gt;
    return PozCautata&lt;br /&gt;
&lt;br /&gt;
def find_books(n, x, sp):&lt;br /&gt;
    maxim = 0&lt;br /&gt;
    st = 0&lt;br /&gt;
    dr = 0&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        poz = CautBin(x, i, n, sp)&lt;br /&gt;
        if sp[poz] - sp[i-1] &amp;gt; maxim and sp[poz] - sp[i-1] &amp;lt;= x:&lt;br /&gt;
            maxim = sp[poz] - sp[i-1]&lt;br /&gt;
            st = i&lt;br /&gt;
            dr = poz&lt;br /&gt;
    return st, dr&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    try:&lt;br /&gt;
        n, x, sp = read_input()&lt;br /&gt;
        st, dr = find_books(n, x, sp)&lt;br /&gt;
        print(st, dr)&lt;br /&gt;
    except ValueError as ve:&lt;br /&gt;
        print(str(ve))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod începe prin importarea modulului &amp;quot;sys&amp;quot;, care oferă funcții și variabile utilizate pentru a manipula funcționalitatea specifică a sistemului de operare. Apoi, se definește o valoare infinită numită &amp;quot;Inf&amp;quot; care este utilizată mai târziu în cod.&lt;br /&gt;
&lt;br /&gt;
În continuare, fișierele de intrare și ieșire sunt deschise pentru citire și scriere, respectiv, utilizând metoda &amp;quot;open&amp;quot; a modulului &amp;quot;sys&amp;quot;. Fișierul de intrare &amp;quot;carti2.in&amp;quot; va fi utilizat pentru citirea datelor de intrare, iar fișierul de ieșire &amp;quot;carti2.out&amp;quot; va fi utilizat pentru afișarea rezultatelor.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;validate_input&amp;quot; primește doi parametri &amp;quot;n&amp;quot; și &amp;quot;x&amp;quot; și verifică dacă aceștia sunt în intervalul [1, 100000] și [1, 1000000000], respectiv. Dacă nu sunt, atunci se generează o excepție &amp;quot;ValueError&amp;quot; cu un mesaj corespunzător.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;read_input&amp;quot; citește valorile &amp;quot;n&amp;quot; și &amp;quot;x&amp;quot; de la intrare, le validează folosind funcția &amp;quot;validate_input&amp;quot;, afișează un mesaj de &amp;quot;Input valid&amp;quot; și apoi citește &amp;quot;n&amp;quot; numere întregi de la intrare și le stochează într-o listă numită &amp;quot;sp&amp;quot;. Lista &amp;quot;sp&amp;quot; este o listă de suma acumulată, care conține suma primelor &amp;quot;i&amp;quot; numere din intrare la fiecare poziție &amp;quot;i&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;CautBin&amp;quot; primește patru parametri: valoarea &amp;quot;x&amp;quot; pe care o căutăm, poziția &amp;quot;poz&amp;quot; la care începem căutarea, numărul total de cărți &amp;quot;n&amp;quot; și lista &amp;quot;sp&amp;quot; cu suma acumulată. Această funcție caută poziția maximă &amp;quot;PozCautata&amp;quot; astfel încât suma acumulată de la poziția &amp;quot;poz&amp;quot; până la poziția &amp;quot;PozCautata&amp;quot; să fie mai mică sau egală cu &amp;quot;x&amp;quot;. Căutarea se face utilizând o căutare binară, care reduce numărul de operații necesare în comparație cu o căutare liniară.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;find_books&amp;quot; primește trei parametri: numărul total de cărți &amp;quot;n&amp;quot;, valoarea maximă a sumei &amp;quot;x&amp;quot; și lista &amp;quot;sp&amp;quot; cu suma acumulată. Această funcție găsește cele mai multe cărți consecutive pe care le putem cumpăra, astfel încât suma totală a prețurilor lor să fie mai mică sau egală cu &amp;quot;x&amp;quot;. Funcția utilizează funcția &amp;quot;CautBin&amp;quot; pentru a găsi poziția maximă &amp;quot;PozCautata&amp;quot; astfel încât suma acumulată să fie mai mică sau egală cu &amp;quot;x&amp;quot; și apoi compară această sumă cu maximul curent și, dacă este mai mare, actualizează valorile &amp;quot;maxim&amp;quot;, &amp;quot;st&amp;quot; și &amp;quot;dr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Blocul `if __name__ == &amp;quot;__main__&amp;quot;` reprezintă o convenție folosită în Python pentru a verifica dacă scriptul curent este rulat ca program principal (adica rulat direct, nu importat ca modul în alt script). &lt;br /&gt;
&lt;br /&gt;
Dacă scriptul este rulat ca program principal, blocul de cod sub acest `if` va fi executat, altfel va fi ignorat. În acest caz, `try`/`except` blocul este folosit pentru a prinde orice excepții care pot fi ridicate în timpul rulării codului din funcțiile `read_input()` și `find_books()`. &lt;br /&gt;
&lt;br /&gt;
Astfel, dacă există excepții de tipul `ValueError` ridicate de funcția `validate_input()`, acestea vor fi prinse și mesajul de eroare corespunzător va fi afișat. Dacă nu apar erori, funcția `find_books()` este apelată și rezultatul acesteia (în acest caz, valorile `st` și `dr`) vor fi afișate la ieșirea standard.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2001_-_Huge_Control&amp;diff=5802</id>
		<title>2001 - Huge Control</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2001_-_Huge_Control&amp;diff=5802"/>
		<updated>2023-05-03T06:41:04Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cifra de control a unui număr se obţine efectuând suma cifrelor sale, apoi suma cifrelor acestei sume etc. până se obţine o sumă formată dintr-o singură cifră. De exemplu, cifra de control a numărului 713 este 2. (7 + 1 + 3 = 11, 1 + 1 = 2).&lt;br /&gt;
&lt;br /&gt;
Un număr de tip Huge este un număr natural de maxim 1.000.000 de cifre.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
În fișierul hugecontrol.in se găsește memorat un număr N, de tip Huge. Calculati și afișati cifra de control a numărului.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește din fișierul de intrare hugecontrol.in numărul N, de tip Huge.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa în fișierul de ieșire hugecontrol.out numărul digit, reprezentând cifra de control a lui N, alături de un mesaj de validare a datelor introduse (&amp;quot;Input valid&amp;quot; sau &amp;quot;Input invalid&amp;quot; după caz).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
N este un număr cu proprietăți caracteristice tipului Huge.&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 713&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 2&lt;br /&gt;
==Explicație==&lt;br /&gt;
7 + 1 + 3 = 11, 1 + 1 = 2 &lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def is_valid_number(n):&lt;br /&gt;
    return n.isdigit() and len(n) &amp;lt;= 1000000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_control_digit(n):&lt;br /&gt;
    nr = 0&lt;br /&gt;
&lt;br /&gt;
    for c in n:&lt;br /&gt;
        nr = nr * 10 + int(c)&lt;br /&gt;
        nr %= 9&lt;br /&gt;
&lt;br /&gt;
    return 9 if nr == 0 else nr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;hugecontrol.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;hugecontrol.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
        if not is_valid_number(n):&lt;br /&gt;
            print(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        control_digit = compute_control_digit(n)&lt;br /&gt;
        fout.write(str(control_digit))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aceste funcții aparțin unui program care primește un număr mare și verifică dacă este valid, apoi calculează și scrie într-un fișier cifra de control a numărului dat.&lt;br /&gt;
&lt;br /&gt;
`is_valid_number(n)` este o funcție care primește un șir de caractere `n` și returnează `True` dacă șirul este format din cifre și are lungimea mai mică sau egală cu un milion, altfel returnează `False`. Această funcție este utilizată pentru a verifica dacă numărul de intrare este valid.&lt;br /&gt;
&lt;br /&gt;
`compute_control_digit(n)` este o funcție care primește un șir de caractere `n` și calculează cifra de control a numărului dat. Algoritmul pentru a calcula cifra de control este următorul:&lt;br /&gt;
&lt;br /&gt;
# Se pornește cu valoarea 0 pentru variabila `nr`.&lt;br /&gt;
# Se parcurge fiecare caracter din șirul de intrare `n`.&lt;br /&gt;
# Pentru fiecare caracter, se multiplică `nr` cu 10 și se adaugă valoarea numerică a caracterului.&lt;br /&gt;
# Se face modulo 9 pentru a reduce `nr` la un număr între 0 și 8.&lt;br /&gt;
# Când toți caracterele sunt procesate, se returnează 9 dacă `nr` este egal cu 0, altfel se returnează valoarea din `nr`.&lt;br /&gt;
&lt;br /&gt;
În codul principal, `__name__ == &amp;quot;__main__&amp;quot;` asigură faptul că blocul de cod din interiorul lui este executat numai atunci când fișierul este rulat ca un script și nu ca modul importat.&lt;br /&gt;
&lt;br /&gt;
În interiorul blocului principal, fișierul &amp;quot;hugecontrol.in&amp;quot; este deschis și citit, iar primul rând este citit ca șirul de intrare `n`. Apoi, se verifică dacă numărul este valid folosind `is_valid_number(n)`. Dacă numărul nu este valid, se afișează mesajul &amp;quot;Input invalid&amp;quot; și programul se termină. Altfel, se afișează mesajul &amp;quot;Input valid&amp;quot; și se calculează cifra de control folosind `compute_control_digit(n)`. Această cifră de control este scrisă în fișierul &amp;quot;hugecontrol.out&amp;quot; folosind `fout.write(str(control_digit))`.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1992_-_PlatouAT&amp;diff=5801</id>
		<title>1992 - PlatouAT</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1992_-_PlatouAT&amp;diff=5801"/>
		<updated>2023-05-03T06:37:37Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se definește operația AT un procedeu prin care se schimbă caracterul &#039;A&#039; în &#039;T&#039; și caracterul &#039;T&#039; în &#039;A&#039;. Operația poate fi modelată ca o funcție astfel: AT(A) = T și AT(T) = A. Operația se generalizează pentru orice secvență de caractere formată din literele A și T. De exemplu, dacă se aplică operația AT pentru secvența AAATTA, se va obține TTTAAT. Notăm AT(AAATTA) = TTTAAT.&lt;br /&gt;
&lt;br /&gt;
Considerăm șirul infinit S, definit după următoarea regulă:&lt;br /&gt;
&lt;br /&gt;
* S1 = ATTA&lt;br /&gt;
* S2 = ATTATAATTAATATTA&lt;br /&gt;
* S3 = ATTATAATTAATATTATAATATTAATTATAATTAATATTAATTATAATATTATAATTAATATTA&lt;br /&gt;
În general: S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt; = S&amp;lt;sub&amp;gt;n-1&amp;lt;/sub&amp;gt;  AT(S&amp;lt;sub&amp;gt;n-1&amp;lt;/sub&amp;gt; )  AT(S&amp;lt;sub&amp;gt;n-1&amp;lt;/sub&amp;gt; ) S&amp;lt;sub&amp;gt;n-1&amp;lt;/sub&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Se dau n numere naturale: k&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; , k&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; , k&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;  ... k&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;. Pentru fiecare număr k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; se determină caracterul de pe poziția k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; dintr-un element al șirului S care are cel puțin k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; caractere. Cu aceste caractere se construiește un nou șir V.&lt;br /&gt;
&lt;br /&gt;
Să se determine un număr L cu toți biții setați, reprezentând lungimea maximă a unei secvențe maximale de caractere &#039;T&#039; din șirul V. Dacă în șirul V nu există nicio astfel de secvență se va afișa mesajul NU EXISTA.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi cele n numere naturale de forma k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul L cerut sau mesajul NU EXISTA, alături de un mesaj de confirmare a datelor (&amp;quot;Input valid&amp;quot; sau &amp;quot;Input invalid&amp;quot; după caz).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* L &amp;amp;les; N &amp;amp;les; 1.111.111;&lt;br /&gt;
* cele n numere citite vor fi mai mici decât 2&amp;lt;sup&amp;gt;61&amp;lt;/sup&amp;gt;;&lt;br /&gt;
* un număr natural are toți biții setați dacă reprezentarea sa binară conține numai cifre 1;&lt;br /&gt;
* pentru un șir dat, o secvență de elemente cu o anumită proprietate este maximală dacă la secvență nu se mai pot adăuga elemente cu acea proprietatea. De exemplu, în șirul qweauaiopaert secvența de vocale eauaio este maximală, dar secvența eaua nu este maximală pentru că la ea se mai pot adăuga alte vocale.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
===Exemplul 1:===&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 1 2 2 2 1&lt;br /&gt;
;Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 3&lt;br /&gt;
Explicație&lt;br /&gt;
S-a format șirul V : ATTTA, cea mai lunga secvență de elemente T are lungimea 3, iar 3 este un număr cu toți biții setați.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2:===&lt;br /&gt;
;Intrare&lt;br /&gt;
: 20&lt;br /&gt;
: 1 2 1 2 2 2 1 2 2 2 2 2 2 2 1 1 1 1 1 1&lt;br /&gt;
;Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 7&lt;br /&gt;
Explicație&lt;br /&gt;
S-a format șirul V : ATATTTATTTTTTTAAAAAA, lungimile secvențelor sunt : 1, 3, 7, toate aceste numere au biții setați, însă, cea mai lungă secvență este de 7 T-uri.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3:===&lt;br /&gt;
;Intrare&lt;br /&gt;
: 6&lt;br /&gt;
: 1 2 3 2 3 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: NU EXISTA&lt;br /&gt;
Explicație&lt;br /&gt;
S-a format șirul V : ATTTTA, cea mai lungă secvență de elemente T are lungimea 4, iar 4 NU este un număr cu toți biții setați.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 4:===&lt;br /&gt;
; Intrare&lt;br /&gt;
: 15&lt;br /&gt;
: 6 3 2 3 4 3 3 2 3 2 2 3 2 1 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 3&lt;br /&gt;
Explicație&lt;br /&gt;
S-a format șirul V : ATTTATTTTTTTTAA, cea mai lungă secvență de elemente T are lungimea 8, dar 8 NU este un număr cu toți biții setați. Cea mai lungă secvență de elemente T, de lungime L, L fiind un număr cu toți biții setați, este TTT și are lungime 3.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def all_bits(x):&lt;br /&gt;
    return (x and not (x &amp;amp; (x-1))) # verifica daca toate bitii lui x sunt setati la 1&lt;br /&gt;
&lt;br /&gt;
def validate_input(x):&lt;br /&gt;
    return x &amp;lt; 2**61 and all_bits(x)&lt;br /&gt;
&lt;br /&gt;
def get_secv(x):&lt;br /&gt;
    secv = 1&lt;br /&gt;
    while secv &amp;lt; x: # caut lungimea sirului, putere de 4, care cuprinde pozitia x&lt;br /&gt;
        secv &amp;lt;&amp;lt;= 2&lt;br /&gt;
    return secv&lt;br /&gt;
&lt;br /&gt;
def reduce_to_first_cadran(x, secv):&lt;br /&gt;
    cadran = x // secv + (x % secv != 0) # aflu &amp;quot;cadranul&amp;quot; in care ma aflu, raportat la lungimea secventelor&lt;br /&gt;
    if cadran == 1:&lt;br /&gt;
        return x, 65 # cazul de baza, nu sufera transformari&lt;br /&gt;
    elif cadran == 2 or cadran == 3:&lt;br /&gt;
        x -= (cadran - 1) * secv # reduc x ul in primul cadran&lt;br /&gt;
        return x, 149 - 65 # se schimba valoarea&lt;br /&gt;
    else:&lt;br /&gt;
        x -= 3 * secv # reduc x ul in primul cadran&lt;br /&gt;
        return x, 65&lt;br /&gt;
&lt;br /&gt;
def process_input(n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        x = int(input())&lt;br /&gt;
        if validate_input(x):&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
            secv = get_secv(x)&lt;br /&gt;
            x, c = reduce_to_first_cadran(x, secv)&lt;br /&gt;
            yield x, secv, c&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    lmax = 0&lt;br /&gt;
    l = 0&lt;br /&gt;
    start = False&lt;br /&gt;
&lt;br /&gt;
    for x, secv, c in process_input(n):&lt;br /&gt;
        if x == 2 or x == 3:&lt;br /&gt;
            c = 149 - c&lt;br /&gt;
        if c == ord(&#039;T&#039;):&lt;br /&gt;
            if not start:&lt;br /&gt;
                start = True&lt;br /&gt;
                l = 1&lt;br /&gt;
            else:&lt;br /&gt;
                l += 1&lt;br /&gt;
        else:&lt;br /&gt;
            if all_bits(l + 1):&lt;br /&gt;
                lmax = max(lmax, l)&lt;br /&gt;
            l = 0&lt;br /&gt;
            start = False&lt;br /&gt;
&lt;br /&gt;
    if all_bits(l + 1):&lt;br /&gt;
        lmax = max(lmax, l)&lt;br /&gt;
&lt;br /&gt;
    if lmax:&lt;br /&gt;
        print(lmax)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;NU EXISTA&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod implementează o funcționalitate care primește un număr n și n valori întregi de la utilizator. Funcția verifică dacă fiecare valoare îndeplinește anumite condiții și, dacă da, efectuează anumite transformări și calculează lungimea celei mai lungi secvențe continue de caractere &#039;T&#039; în codul ASCII obținut în urma transformărilor.&lt;br /&gt;
&lt;br /&gt;
Funcția all_bits(x) primește un întreg și verifică dacă toți biții sunt setați la 1. Funcția validate_input(x) verifică dacă valoarea introdusă x este mai mică decât 2^61 și toți biții sunt setați la 1. Funcția get_secv(x) calculează cea mai mare putere de 4 mai mică decât valoarea introdusă x.&lt;br /&gt;
&lt;br /&gt;
Funcția reduce_to_first_cadran(x, secv) primește două valori, o valoare întreagă x și o valoare secv și calculează în ce cadran se află x raportat la secv, reducând x la valoarea sa din primul cadran (între 0 și secv). Funcția returnează valoarea x și c, care este un număr în funcție de cadranul în care se află x.&lt;br /&gt;
&lt;br /&gt;
Funcția process_input(n) primește un întreg n și citește n valori întregi de la utilizator. Pentru fiecare valoare, se verifică dacă aceasta îndeplinește condițiile necesare și, în caz afirmativ, se calculează secvența și cadranul corespunzătoare, și se returnează o secvență de trei valori: x, secv și c.&lt;br /&gt;
&lt;br /&gt;
Blocul __main__ primește un întreg n și apelează funcția process_input(n) pentru a procesa valorile introduse. Pentru fiecare valoare x, se aplică anumite transformări și se calculează lungimea celei mai lungi secvențe continue de caractere &#039;T&#039; în codul ASCII obținut. Lungimea maximă a secvenței este afișată la sfârșitul funcției.&lt;br /&gt;
&lt;br /&gt;
În general, codul este folosit pentru a procesa și transforma date și pentru a calcula anumite valori specifice, cum ar fi lungimea celei mai lungi secvențe de caractere.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2553_-_Josephus&amp;diff=5800</id>
		<title>2553 - Josephus</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2553_-_Josephus&amp;diff=5800"/>
		<updated>2023-05-03T06:36:41Z</updated>

		<summary type="html">&lt;p&gt;Cata: /* Exemplu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Aceasta este o problemă foarte cunoscută atât în universul informatic, cât și în cel matematic!&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Legenda ne povestește că Josephus și alți n-1 soldați evrei se luptau cu trupele romane. Din nefericire pentru aceștia, au ajuns foarte curând încercuiți și doborâți numeric. Ei se hotărăsc rapid să nu se predea, dar nici să nu își ia de unii singuri viața și astfel le vine următoarea idee: se așează cu toții într-un cerc și își scriu pe rând pe frunte câte un număr, reprezentând indicativul fiecăruia (1, 2, …, n). Soldații decid ca soldatul cu numărul 1 să îl trimită în rai pe soldatul încă în viață din stânga sa (notat, în acest context, cu numărul 2), apoi următorul soldat în viață să repete aceeași acțiune până când nu va mai rămâne decât o singură persoană în viață.&lt;br /&gt;
&lt;br /&gt;
Josephus ar fi preferat să se predea. Pe ce poziție ar fi trebuit să se afle soldatul pentru a putea realiza acest lucru?&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va citi un singur număr natural nenul, n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Se va afișa un singur număr ce reprezintă poziția pe care Josephus trebuia să se afle pentru a rămâne în viață, alături de un mesaj de validare a datelor introduse (&amp;quot;Input valid&amp;quot;; se afișează &amp;quot;n trebuie să fie între i și 10^18&amp;quot; în caz contrar).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 ≤ n ≤ 1018;&lt;br /&gt;
* Se garantează că există o soluție pentru oricare n;&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 41&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 19&lt;br /&gt;
==Explicație==&lt;br /&gt;
1 ⇒ 2 &amp;lt;br&amp;gt;&lt;br /&gt;
3 ⇒ 4&amp;lt;br&amp;gt;&lt;br /&gt;
…&amp;lt;br&amp;gt;&lt;br /&gt;
39 ⇒ 40&amp;lt;br&amp;gt;&lt;br /&gt;
41 ⇒ 1&amp;lt;br&amp;gt;&lt;br /&gt;
3 ⇒ 5&amp;lt;br&amp;gt;&lt;br /&gt;
…&amp;lt;br&amp;gt;&lt;br /&gt;
39 ⇒ 41&amp;lt;br&amp;gt;&lt;br /&gt;
3 ⇒ 7&amp;lt;br&amp;gt;&lt;br /&gt;
11 ⇒ 15&amp;lt;br&amp;gt;&lt;br /&gt;
………&amp;lt;br&amp;gt;&lt;br /&gt;
19 ⇒ 35&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def calculate_exponent(n):&lt;br /&gt;
    exponent = 0&lt;br /&gt;
    save_n = n&lt;br /&gt;
    while save_n != 1:&lt;br /&gt;
        save_n //= 2&lt;br /&gt;
        exponent += 1&lt;br /&gt;
    return exponent&lt;br /&gt;
&lt;br /&gt;
def is_power_of_two(n):&lt;br /&gt;
    exponent = calculate_exponent(n)&lt;br /&gt;
    return (1 &amp;lt;&amp;lt; exponent) == n&lt;br /&gt;
&lt;br /&gt;
def calculate_result(n):&lt;br /&gt;
    exponent = calculate_exponent(n)&lt;br /&gt;
    if is_power_of_two(n):&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return ((n - (1 &amp;lt;&amp;lt; exponent)) &amp;lt;&amp;lt; 1) + 1&lt;br /&gt;
&lt;br /&gt;
def validate_n(n):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 10**18:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie să fie între i și 10^18&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    validate_n(n)&lt;br /&gt;
    print(calculate_result(n))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest program implementează trei funcții care lucrează împreună pentru a verifica dacă un număr întreg n este o putere a lui 2 și pentru a calcula un rezultat bazat pe n.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;calculate_exponent&amp;quot; primește un număr întreg n și calculează exponentul său în baza 2. Exponentul este calculat prin împărțirea repetată a lui n la 2 până când n ajunge la valoarea 1, numărul de împărțiri fiind exponentul.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;is_power_of_two&amp;quot; primește un număr întreg n și verifică dacă este o putere a lui 2, comparându-l cu 2 ridicat la exponentul calculat în funcția anterioară.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;calculate_result&amp;quot; primește un număr întreg n și calculează rezultatul bazat pe aceasta. Dacă n este o putere a lui 2, rezultatul va fi 1, altfel va fi calculat după o formulă dată.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;validate_n&amp;quot; primește un număr întreg n și verifică dacă se încadrează între 1 și 10^18 inclusiv. Dacă n nu se încadrează în această plajă, funcția va arunca o excepție &amp;quot;ValueError&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
În metoda &amp;quot;main&amp;quot;, se primește un număr întreg n de la utilizator, se validează și se calculează și se afișează rezultatul apelând funcția &amp;quot;calculate_result&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1973_-_Hambar2&amp;diff=5799</id>
		<title>1973 - Hambar2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1973_-_Hambar2&amp;diff=5799"/>
		<updated>2023-05-03T06:36:20Z</updated>

		<summary type="html">&lt;p&gt;Cata: /* Exemplu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Enunț==&lt;br /&gt;
Prințesa Gîrcella este foarte frumoasă. Fiindcă a venit momentul să se mărite, foarte mulți feciori au venit să îi ceară mâna. Printre aceștia se află și Cavalerul de Aur, marele algoritmician. Gîrcella îl dorește pe cel mai inteligent, așa că le va pune o provocare. Grădina sa este o matrice pătratică binară (cu valori 0 sau 1), valorile 0 reprezintă teren liber iar valorile 1 reprezintă pomi. Cel ce va găsi suprafața dreptunghică de arie maximă ce conține doar valori 0, pe care va construi un hambar, va câștiga mâna frumoasei Gîrcella.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Ajutați-l pe Cavalerul de Aur să câștige această întrecere.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare hambar2.in conține pe prima linie numerele N și M, reprezentând dimensinunea matricei respectiv numărul de pomi, iar pe următoarele M linii se vor găsi două numere x și y, separate printr-un spațiu, reprezentând indicele liniei, respectiv al coloanei pe care se află un pom.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire hambar2.out va conține pe prima linie numărul S, reprezentând aria maximă a unei suprafețe dreptunghiulare.&lt;br /&gt;
În consolă se va afișa un mesaj de validare a datelor (&amp;quot;Input valid&amp;quot; sau instrucțiuni cu privire la n sau m).&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 ≤ N, M ≤ 1000&lt;br /&gt;
* Nu se vor afla 2 sau mai mulți pomi în același loc.&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; hambar2.in&lt;br /&gt;
: 5 5&lt;br /&gt;
: 1 3&lt;br /&gt;
: 2 1&lt;br /&gt;
: 2 5&lt;br /&gt;
: 5 1&lt;br /&gt;
: 5 5&lt;br /&gt;
:hambar2.out&lt;br /&gt;
: 12&lt;br /&gt;
; Consolă&lt;br /&gt;
: Input valid&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
nMAX = 1000&lt;br /&gt;
&lt;br /&gt;
def clear(stiva):&lt;br /&gt;
    while stiva:&lt;br /&gt;
        stiva.pop()&lt;br /&gt;
&lt;br /&gt;
def calculate_histogram(n, mat):&lt;br /&gt;
    h = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        for j in range(1, n+1):&lt;br /&gt;
            if not mat[i][j]:&lt;br /&gt;
                h[j] += 1&lt;br /&gt;
            else:&lt;br /&gt;
                h[j] = 0&lt;br /&gt;
&lt;br /&gt;
    return h&lt;br /&gt;
&lt;br /&gt;
def calculate_left_boundary(n, h):&lt;br /&gt;
    st = [0] * (n + 1)&lt;br /&gt;
    stiva = []&lt;br /&gt;
&lt;br /&gt;
    for j in range(1, n+1):&lt;br /&gt;
        while stiva and h[stiva[-1]] &amp;gt;= h[j]:&lt;br /&gt;
            stiva.pop()&lt;br /&gt;
&lt;br /&gt;
        if not stiva:&lt;br /&gt;
            st[j] = 0&lt;br /&gt;
        else:&lt;br /&gt;
            st[j] = stiva[-1]&lt;br /&gt;
&lt;br /&gt;
        stiva.append(j)&lt;br /&gt;
&lt;br /&gt;
    return st&lt;br /&gt;
&lt;br /&gt;
def calculate_right_boundary(n, h):&lt;br /&gt;
    dr = [0] * (n + 1)&lt;br /&gt;
    stiva = []&lt;br /&gt;
&lt;br /&gt;
    for j in range(n, 0, -1):&lt;br /&gt;
        while stiva and h[stiva[-1]] &amp;gt;= h[j]:&lt;br /&gt;
            stiva.pop()&lt;br /&gt;
&lt;br /&gt;
        if not stiva:&lt;br /&gt;
            dr[j] = n+1&lt;br /&gt;
        else:&lt;br /&gt;
            dr[j] = stiva[-1]&lt;br /&gt;
&lt;br /&gt;
        stiva.append(j)&lt;br /&gt;
&lt;br /&gt;
    return dr&lt;br /&gt;
&lt;br /&gt;
def calculate_max_rect(n, mat):&lt;br /&gt;
    arieMAX = 0&lt;br /&gt;
&lt;br /&gt;
    h = calculate_histogram(n, mat)&lt;br /&gt;
    st = calculate_left_boundary(n, h)&lt;br /&gt;
    dr = calculate_right_boundary(n, h)&lt;br /&gt;
&lt;br /&gt;
    for j in range(1, n+1):&lt;br /&gt;
        arieMAX = max(arieMAX, h[j] * (dr[j] - st[j] - 1))&lt;br /&gt;
&lt;br /&gt;
    return arieMAX&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, m):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 1000:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie să fie între 1 și 1000&amp;quot;)&lt;br /&gt;
        return 0&lt;br /&gt;
    if not 1 &amp;lt;= m &amp;lt;= 1000:&lt;br /&gt;
        raise ValueError(&amp;quot;m trebuie să fie între 1 și 1000&amp;quot;)&lt;br /&gt;
        return 0&lt;br /&gt;
    return 1&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;hambar2.in&#039;, &#039;r&#039;) as fin, open(&#039;hambar2.out&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        if validate_input(n, m):&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        mat = [[False] * (nMAX + 1) for _ in range(nMAX + 1)]&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y = map(int, fin.readline().split())&lt;br /&gt;
            mat[x][y] = True&lt;br /&gt;
&lt;br /&gt;
        fout.write(str(calculate_max_rect(n, mat)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest cod implementează o soluție pentru problema de a găsi cea mai mare suprafață a unui dreptunghi cu toate elementele sale nealbe într-o matrice dată de dimensiunea n x n. Mai precis, codul conține următoarele funcții:&lt;br /&gt;
&lt;br /&gt;
- Funcția &amp;quot;clear&amp;quot; golește conținutul unei stive date ca argument;&lt;br /&gt;
- Funcția &amp;quot;calculate_histogram&amp;quot; calculează histograma pentru matricea dată și returnează o listă de dimensiune n+1, unde primul element este 0 și următoarele elemente reprezintă înălțimea coloanelor corespunzătoare din matrice;&lt;br /&gt;
- Funcțiile &amp;quot;calculate_left_boundary&amp;quot; și &amp;quot;calculate_right_boundary&amp;quot; calculează limitele stângi, respectiv drepte ale dreptunghiurilor care conțin fiecare coloană din matricea dată și care au înălțimile date de histograma calculată anterior. Acestea returnează două liste de dimensiune n+1, unde primul și ultimul element sunt 0, iar restul elementelor reprezintă limitele stângi sau drepte corespunzătoare;&lt;br /&gt;
- Funcția &amp;quot;calculate_max_rect&amp;quot; calculează cea mai mare suprafață a unui dreptunghi cu toate elementele sale nealbe în matricea dată, folosind funcțiile &amp;quot;calculate_histogram&amp;quot;, &amp;quot;calculate_left_boundary&amp;quot; și &amp;quot;calculate_right_boundary&amp;quot;;&lt;br /&gt;
- Funcția &amp;quot;validate_input&amp;quot; verifică dacă valorile n și m sunt în intervalul [1, 1000] și generează o excepție în caz contrar.&lt;br /&gt;
&lt;br /&gt;
În secțiunea &amp;quot;if __name__ == &#039;__main__&#039;:&amp;quot; se deschide fișierul &amp;quot;hambar2.in&amp;quot; pentru citire și fișierul &amp;quot;hambar2.out&amp;quot; pentru scriere, se citește dimensiunea matricei și numărul de elemente albe din aceasta și se verifică dacă valorile introduse sunt valide. Dacă sunt, se construiește matricea folosind elementele citite și se apelează funcția &amp;quot;calculate_max_rect&amp;quot; pentru a calcula cea mai mare suprafață a unui dreptunghi cu toate elementele sale nealbe. Rezultatul este scris în fișierul &amp;quot;hambar2.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2319_-_abc&amp;diff=5798</id>
		<title>2319 - abc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2319_-_abc&amp;diff=5798"/>
		<updated>2023-05-03T06:35:08Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dau două numere naturale nenule a şi b, iar produsul lor îl notăm cu c. Aflaţi cel mai mare divizor propriu al lui A=2&amp;lt;sup&amp;gt;c&amp;lt;/sup&amp;gt;-1.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele a şi b, separate prin spațiu.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul D, reprezentând cel mai mare divizor propriu al lui A, alături de un mesaj de validare a datelor introduse (&amp;quot;Input valid&amp;quot; sau instrucțiuni pentru reintroducerea lui a sau b).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 2 &amp;amp;les; a &amp;amp;les; 20&lt;br /&gt;
* 2 &amp;amp;les; b &amp;amp;les; 10.000&lt;br /&gt;
* Un divizor propriu al lui A este diferit de 1 şi de A&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 3 2 &lt;br /&gt;
; Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 21&lt;br /&gt;
==Explicație==&lt;br /&gt;
Avem c=6 şi A=26-1=63. Cel mai mare divizor propriu al lui A este 21.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_a(a):&lt;br /&gt;
    if not (2 &amp;lt;= a &amp;lt;= 20):&lt;br /&gt;
        raise ValueError(&amp;quot;a trebuie să fie între 2 și 20&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_b(b):&lt;br /&gt;
    if not (2 &amp;lt;= b &amp;lt;= 10000):&lt;br /&gt;
        raise ValueError(&amp;quot;b trebuie să fie între 2 și 10000&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def largest_proper_divisor_of_A(a, b):&lt;br /&gt;
    validate_a(a)&lt;br /&gt;
    validate_b(b)&lt;br /&gt;
    print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    c = a * b&lt;br /&gt;
    A = 2 ** c - 1&lt;br /&gt;
&lt;br /&gt;
    divisors = []&lt;br /&gt;
    for i in range(2, int(A ** 0.5) + 1):&lt;br /&gt;
        if A % i == 0:&lt;br /&gt;
            divisors.append(i)&lt;br /&gt;
            if i != A // i:&lt;br /&gt;
                divisors.append(A // i)&lt;br /&gt;
&lt;br /&gt;
    divisors.sort(reverse=True)&lt;br /&gt;
&lt;br /&gt;
    for divisor in divisors:&lt;br /&gt;
        if gcd(A, divisor) == divisor:&lt;br /&gt;
            return divisor&lt;br /&gt;
&lt;br /&gt;
    raise ValueError(&amp;quot;Nu există divizori proprii pentru A&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    a, b = map(int, input(&amp;quot;Introduceți a și b, separate prin spațiu: &amp;quot;).split())&lt;br /&gt;
    divisor = largest_proper_divisor_of_A(a, b)&lt;br /&gt;
    print(f&amp;quot;Cel mai mare divizor propriu al lui A este: {divisor}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod definește patru funcții: validate_a(a), validate_b(b), gcd(a, b) și largest_proper_divisor_of_A(a, b), și apoi apelează funcția main() dacă script-ul este rulat ca program principal.&lt;br /&gt;
&lt;br /&gt;
Funcția validate_a(a) verifică dacă argumentul a este un număr între 2 și 20. Dacă nu, generează o excepție de tip ValueError.&lt;br /&gt;
&lt;br /&gt;
Funcția validate_b(b) verifică dacă argumentul b este un număr între 2 și 10000. Dacă nu, generează o excepție de tip ValueError.&lt;br /&gt;
&lt;br /&gt;
Funcția gcd(a, b) calculează cel mai mare divizor comun (gcd) al lui a și b folosind algoritmul Euclid.&lt;br /&gt;
&lt;br /&gt;
Funcția largest_proper_divisor_of_A(a, b) primește doi argumente a și b, validează valorile lor cu ajutorul funcțiilor validate_a(a) și validate_b(b) și scrie un mesaj de confirmare a validării datelor introduse, calculează c = a * b și A = 2 ** c - 1, și apoi găsește cel mai mare divizor propriu al lui A. Un divizor propriu al unui număr este un divizor strict mai mic decât acel număr. Dacă nu există niciun divizor propriu al lui A, funcția generează o excepție de tip ValueError.&lt;br /&gt;
&lt;br /&gt;
Funcția main() citește de la tastatură două numere întregi separate prin spațiu, apoi apelează funcția largest_proper_divisor_of_A(a, b) pentru a găsi cel mai mare divizor propriu al lui A și îl afișează.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1992_-_PlatouAT&amp;diff=5797</id>
		<title>1992 - PlatouAT</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1992_-_PlatouAT&amp;diff=5797"/>
		<updated>2023-05-03T06:33:51Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se definește operația AT un procedeu prin care se schimbă caracterul &#039;A&#039; în &#039;T&#039; și caracterul &#039;T&#039; în &#039;A&#039;. Operația poate fi modelată ca o funcție astfel: AT(A) = T și AT(T) = A. Operația se generalizează pentru orice secvență de caractere formată din literele A și T. De exemplu, dacă se aplică operația AT pentru secvența AAATTA, se va obține TTTAAT. Notăm AT(AAATTA) = TTTAAT.&lt;br /&gt;
&lt;br /&gt;
Considerăm șirul infinit S, definit după următoarea regulă:&lt;br /&gt;
&lt;br /&gt;
* S1 = ATTA&lt;br /&gt;
* S2 = ATTATAATTAATATTA&lt;br /&gt;
* S3 = ATTATAATTAATATTATAATATTAATTATAATTAATATTAATTATAATATTATAATTAATATTA&lt;br /&gt;
În general: S&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt; = S&amp;lt;sub&amp;gt;n-1&amp;lt;/sub&amp;gt;  AT(S&amp;lt;sub&amp;gt;n-1&amp;lt;/sub&amp;gt; )  AT(S&amp;lt;sub&amp;gt;n-1&amp;lt;/sub&amp;gt; ) S&amp;lt;sub&amp;gt;n-1&amp;lt;/sub&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Se dau n numere naturale: k&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; , k&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; , k&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;  ... k&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;. Pentru fiecare număr k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; se determină caracterul de pe poziția k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; dintr-un element al șirului S care are cel puțin k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; caractere. Cu aceste caractere se construiește un nou șir V.&lt;br /&gt;
&lt;br /&gt;
Să se determine un număr L cu toți biții setați, reprezentând lungimea maximă a unei secvențe maximale de caractere &#039;T&#039; din șirul V. Dacă în șirul V nu există nicio astfel de secvență se va afișa mesajul NU EXISTA.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n, iar apoi cele n numere naturale de forma k&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran numărul L cerut sau mesajul NU EXISTA, alături de un mesaj de confirmare a datelor (&amp;quot;Input valid&amp;quot; sau &amp;quot;Input invalid&amp;quot; după caz).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* L &amp;amp;les; N &amp;amp;les; 1.111.111;&lt;br /&gt;
* cele n numere citite vor fi mai mici decât 2&amp;lt;sup&amp;gt;61&amp;lt;/sup&amp;gt;;&lt;br /&gt;
* un număr natural are toți biții setați dacă reprezentarea sa binară conține numai cifre 1;&lt;br /&gt;
* pentru un șir dat, o secvență de elemente cu o anumită proprietate este maximală dacă la secvență nu se mai pot adăuga elemente cu acea proprietatea. De exemplu, în șirul qweauaiopaert secvența de vocale eauaio este maximală, dar secvența eaua nu este maximală pentru că la ea se mai pot adăuga alte vocale.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
===Exemplul 1:===&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 1 2 2 2 1&lt;br /&gt;
;Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 3&lt;br /&gt;
Explicație&lt;br /&gt;
S-a format șirul V : ATTTA, cea mai lunga secvență de elemente T are lungimea 3, iar 3 este un număr cu toți biții setați.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2:===&lt;br /&gt;
;Intrare&lt;br /&gt;
: 20&lt;br /&gt;
: 1 2 1 2 2 2 1 2 2 2 2 2 2 2 1 1 1 1 1 1&lt;br /&gt;
;Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 7&lt;br /&gt;
Explicație&lt;br /&gt;
S-a format șirul V : ATATTTATTTTTTTAAAAAA, lungimile secvențelor sunt : 1, 3, 7, toate aceste numere au biții setați, însă, cea mai lungă secvență este de 7 T-uri.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3:===&lt;br /&gt;
;Intrare&lt;br /&gt;
: 6&lt;br /&gt;
: 1 2 3 2 3 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: NU EXISTA&lt;br /&gt;
Explicație&lt;br /&gt;
S-a format șirul V : ATTTTA, cea mai lungă secvență de elemente T are lungimea 4, iar 4 NU este un număr cu toți biții setați.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 4:===&lt;br /&gt;
; Intrare&lt;br /&gt;
: 15&lt;br /&gt;
: 6 3 2 3 4 3 3 2 3 2 2 3 2 1 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Input valid&lt;br /&gt;
: 3&lt;br /&gt;
Explicație&lt;br /&gt;
S-a format șirul V : ATTTATTTTTTTTAA, cea mai lungă secvență de elemente T are lungimea 8, dar 8 NU este un număr cu toți biții setați. Cea mai lungă secvență de elemente T, de lungime L, L fiind un număr cu toți biții setați, este TTT și are lungime 3.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def all_bits(x):&lt;br /&gt;
    return (x and not (x &amp;amp; (x-1))) # verifica daca toate bitii lui x sunt setati la 1&lt;br /&gt;
&lt;br /&gt;
def validate_input(x):&lt;br /&gt;
    return x &amp;lt; 2**61 and all_bits(x)&lt;br /&gt;
&lt;br /&gt;
def get_secv(x):&lt;br /&gt;
    secv = 1&lt;br /&gt;
    while secv &amp;lt; x: # caut lungimea sirului, putere de 4, care cuprinde pozitia x&lt;br /&gt;
        secv &amp;lt;&amp;lt;= 2&lt;br /&gt;
    return secv&lt;br /&gt;
&lt;br /&gt;
def reduce_to_first_cadran(x, secv):&lt;br /&gt;
    cadran = x // secv + (x % secv != 0) # aflu &amp;quot;cadranul&amp;quot; in care ma aflu, raportat la lungimea secventelor&lt;br /&gt;
    if cadran == 1:&lt;br /&gt;
        return x, 65 # cazul de baza, nu sufera transformari&lt;br /&gt;
    elif cadran == 2 or cadran == 3:&lt;br /&gt;
        x -= (cadran - 1) * secv # reduc x ul in primul cadran&lt;br /&gt;
        return x, 149 - 65 # se schimba valoarea&lt;br /&gt;
    else:&lt;br /&gt;
        x -= 3 * secv # reduc x ul in primul cadran&lt;br /&gt;
        return x, 65&lt;br /&gt;
&lt;br /&gt;
def process_input(n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        x = int(input())&lt;br /&gt;
        if validate_input(x):&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
            secv = get_secv(x)&lt;br /&gt;
            x, c = reduce_to_first_cadran(x, secv)&lt;br /&gt;
            yield x, secv, c&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    lmax = 0&lt;br /&gt;
    l = 0&lt;br /&gt;
    start = False&lt;br /&gt;
&lt;br /&gt;
    for x, secv, c in process_input(n):&lt;br /&gt;
        if x == 2 or x == 3:&lt;br /&gt;
            c = 149 - c&lt;br /&gt;
        if c == ord(&#039;T&#039;):&lt;br /&gt;
            if not start:&lt;br /&gt;
                start = True&lt;br /&gt;
                l = 1&lt;br /&gt;
            else:&lt;br /&gt;
                l += 1&lt;br /&gt;
        else:&lt;br /&gt;
            if all_bits(l + 1):&lt;br /&gt;
                lmax = max(lmax, l)&lt;br /&gt;
            l = 0&lt;br /&gt;
            start = False&lt;br /&gt;
&lt;br /&gt;
    if all_bits(l + 1):&lt;br /&gt;
        lmax = max(lmax, l)&lt;br /&gt;
&lt;br /&gt;
    if lmax:&lt;br /&gt;
        print(lmax)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;NU EXISTA&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod implementează o funcționalitate care primește un număr n și n valori întregi de la utilizator. Funcția verifică dacă fiecare valoare îndeplinește anumite condiții și, dacă da, efectuează anumite transformări și calculează lungimea celei mai lungi secvențe continue de caractere &#039;T&#039; în codul ASCII obținut în urma transformărilor.&lt;br /&gt;
&lt;br /&gt;
Funcția all_bits(x) primește un întreg și verifică dacă toți biții sunt setați la 1. Funcția validate_input(x) verifică dacă valoarea introdusă x este mai mică decât 2^61 și toți biții sunt setați la 1. Funcția get_secv(x) calculează cea mai mare putere de 4 mai mică decât valoarea introdusă x.&lt;br /&gt;
&lt;br /&gt;
Funcția reduce_to_first_cadran(x, secv) primește două valori, o valoare întreagă x și o valoare secv și calculează în ce cadran se află x raportat la secv, reducând x la valoarea sa din primul cadran (între 0 și secv). Funcția returnează valoarea x și c, care este un număr în funcție de cadranul în care se află x.&lt;br /&gt;
&lt;br /&gt;
Funcția process_input(n) primește un întreg n și citește n valori întregi de la utilizator. Pentru fiecare valoare, se verifică dacă aceasta îndeplinește condițiile necesare și, în caz afirmativ, se calculează secvența și cadranul corespunzătoare, și se returnează o secvență de trei valori: x, secv și c.&lt;br /&gt;
&lt;br /&gt;
Funcția main() primește un întreg n și apelează funcția process_input(n) pentru a procesa valorile introduse. Pentru fiecare valoare x, se aplică anumite transformări și se calculează lungimea celei mai lungi secvențe continue de caractere &#039;T&#039; în codul ASCII obținut. Lungimea maximă a secvenței este afișată la sfârșitul funcției.&lt;br /&gt;
&lt;br /&gt;
În general, codul este folosit pentru a procesa și transforma date și pentru a calcula anumite valori specifice, cum ar fi lungimea celei mai lungi secvențe de caractere.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2716_-_UnuDoi&amp;diff=5796</id>
		<title>2716 - UnuDoi</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2716_-_UnuDoi&amp;diff=5796"/>
		<updated>2023-05-03T06:31:16Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă operația &amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;x&amp;lt;/SPAN&amp;gt;:{1,2}→{1,2} astfel încât  &amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;1&amp;lt;/SPAN&amp;gt;=2 și  &amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;2&amp;lt;/SPAN&amp;gt;=1. Operația se poate extinde asupra oricărei secvențe formate cu cifre de 1 și 2, de exemplu  &amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;121121212&amp;lt;/SPAN&amp;gt;=212212121.&lt;br /&gt;
&lt;br /&gt;
Se consideră șirul infinit s format cu cifre de 1 și 2, generat incremental prin extindere, după următoarea regulă de concatenare:&lt;br /&gt;
&lt;br /&gt;
* s1=1221&lt;br /&gt;
* s2=1221211221121221&lt;br /&gt;
* …&lt;br /&gt;
* sk+1=s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;/SPAN&amp;gt;s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, pentru orice număr natural k.&lt;br /&gt;
&lt;br /&gt;
Dându-se un număr natural n, să se determine a n-a cifră a șirului infinit s.&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;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran un mesaj de validare a datelor (&amp;quot;Date de intrare valide&amp;quot; pentru date valide; &amp;quot;Valoarea lui n trebuie sa fie intre 1 si 10^8&amp;quot; dacă n depășește valorile cerute) și a n-a cifră a șirului s.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti valoarea lui n: 11&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 1&lt;br /&gt;
;Intrare&lt;br /&gt;
: Introduceti valoarea lui n: 20&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 2&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 10**8:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def calculate_k(n):&lt;br /&gt;
    k = 1&lt;br /&gt;
    while n &amp;gt;= 4:&lt;br /&gt;
        if n % 4 == 2 or n % 4 == 3:&lt;br /&gt;
            k = 3 - k&lt;br /&gt;
        if n % 4 != 0:&lt;br /&gt;
            n = n // 4 + 1&lt;br /&gt;
        else:&lt;br /&gt;
            n = n // 4&lt;br /&gt;
    if n % 4 == 2 or n % 4 == 3:&lt;br /&gt;
        k = 3 - k&lt;br /&gt;
    return k&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti valoarea lui n: &amp;quot;))&lt;br /&gt;
    if validate_input(n):&lt;br /&gt;
        print(&amp;quot;Date de intrare valide&amp;quot;)&lt;br /&gt;
        k = calculate_k(n)&lt;br /&gt;
        print(k)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Valoarea lui n trebuie sa fie intre 1 si 10^8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Acest cod Python definește două funcții și le folosește pentru a calcula o valoare k în funcție de valoarea introdusă de utilizator pentru n.&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input primește un argument n și returnează True dacă n se află în intervalul [1, 10^8], altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția calculate_k primește un argument n și calculează o valoare k folosind o serie de condiții. În esență, funcția împarte repetat valoarea n la 4 și schimbă valoarea lui k în funcție de restul împărțirii lui n la 4. Aceasta se repetă până când n devine mai mic decât 4.&lt;br /&gt;
&lt;br /&gt;
În funcția principală, utilizatorul este întâmpinat cu un prompt și îi este cerut să introducă o valoare pentru n. Dacă valoarea este validă, funcția calculate_k este apelată cu n ca argument și valoarea rezultată pentru k este afișată. Dacă valoarea n este invalidă, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2553_-_Josephus&amp;diff=5795</id>
		<title>2553 - Josephus</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2553_-_Josephus&amp;diff=5795"/>
		<updated>2023-05-03T06:30:43Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Aceasta este o problemă foarte cunoscută atât în universul informatic, cât și în cel matematic!&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Legenda ne povestește că Josephus și alți n-1 soldați evrei se luptau cu trupele romane. Din nefericire pentru aceștia, au ajuns foarte curând încercuiți și doborâți numeric. Ei se hotărăsc rapid să nu se predea, dar nici să nu își ia de unii singuri viața și astfel le vine următoarea idee: se așează cu toții într-un cerc și își scriu pe rând pe frunte câte un număr, reprezentând indicativul fiecăruia (1, 2, …, n). Soldații decid ca soldatul cu numărul 1 să îl trimită în rai pe soldatul încă în viață din stânga sa (notat, în acest context, cu numărul 2), apoi următorul soldat în viață să repete aceeași acțiune până când nu va mai rămâne decât o singură persoană în viață.&lt;br /&gt;
&lt;br /&gt;
Josephus ar fi preferat să se predea. Pe ce poziție ar fi trebuit să se afle soldatul pentru a putea realiza acest lucru?&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Se va citi un singur număr natural nenul, n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Se va afișa un singur număr ce reprezintă poziția pe care Josephus trebuia să se afle pentru a rămâne în viață, alături de un mesaj de validare a datelor introduse (&amp;quot;Input valid&amp;quot;; se afișează &amp;quot;n trebuie să fie între i și 10^18&amp;quot; în caz contrar).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 ≤ n ≤ 1018;&lt;br /&gt;
* Se garantează că există o soluție pentru oricare n;&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 41&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Valid input&lt;br /&gt;
: 19&lt;br /&gt;
==Explicație==&lt;br /&gt;
1 ⇒ 2 &amp;lt;br&amp;gt;&lt;br /&gt;
3 ⇒ 4&amp;lt;br&amp;gt;&lt;br /&gt;
…&amp;lt;br&amp;gt;&lt;br /&gt;
39 ⇒ 40&amp;lt;br&amp;gt;&lt;br /&gt;
41 ⇒ 1&amp;lt;br&amp;gt;&lt;br /&gt;
3 ⇒ 5&amp;lt;br&amp;gt;&lt;br /&gt;
…&amp;lt;br&amp;gt;&lt;br /&gt;
39 ⇒ 41&amp;lt;br&amp;gt;&lt;br /&gt;
3 ⇒ 7&amp;lt;br&amp;gt;&lt;br /&gt;
11 ⇒ 15&amp;lt;br&amp;gt;&lt;br /&gt;
………&amp;lt;br&amp;gt;&lt;br /&gt;
19 ⇒ 35&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def calculate_exponent(n):&lt;br /&gt;
    exponent = 0&lt;br /&gt;
    save_n = n&lt;br /&gt;
    while save_n != 1:&lt;br /&gt;
        save_n //= 2&lt;br /&gt;
        exponent += 1&lt;br /&gt;
    return exponent&lt;br /&gt;
&lt;br /&gt;
def is_power_of_two(n):&lt;br /&gt;
    exponent = calculate_exponent(n)&lt;br /&gt;
    return (1 &amp;lt;&amp;lt; exponent) == n&lt;br /&gt;
&lt;br /&gt;
def calculate_result(n):&lt;br /&gt;
    exponent = calculate_exponent(n)&lt;br /&gt;
    if is_power_of_two(n):&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return ((n - (1 &amp;lt;&amp;lt; exponent)) &amp;lt;&amp;lt; 1) + 1&lt;br /&gt;
&lt;br /&gt;
def validate_n(n):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 10**18:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie să fie între i și 10^18&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    validate_n(n)&lt;br /&gt;
    print(calculate_result(n))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest program implementează trei funcții care lucrează împreună pentru a verifica dacă un număr întreg n este o putere a lui 2 și pentru a calcula un rezultat bazat pe n.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;calculate_exponent&amp;quot; primește un număr întreg n și calculează exponentul său în baza 2. Exponentul este calculat prin împărțirea repetată a lui n la 2 până când n ajunge la valoarea 1, numărul de împărțiri fiind exponentul.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;is_power_of_two&amp;quot; primește un număr întreg n și verifică dacă este o putere a lui 2, comparându-l cu 2 ridicat la exponentul calculat în funcția anterioară.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;calculate_result&amp;quot; primește un număr întreg n și calculează rezultatul bazat pe aceasta. Dacă n este o putere a lui 2, rezultatul va fi 1, altfel va fi calculat după o formulă dată.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;validate_n&amp;quot; primește un număr întreg n și verifică dacă se încadrează între 1 și 10^18 inclusiv. Dacă n nu se încadrează în această plajă, funcția va arunca o excepție &amp;quot;ValueError&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
În metoda &amp;quot;main&amp;quot;, se primește un număr întreg n de la utilizator, se validează și se calculează și se afișează rezultatul apelând funcția &amp;quot;calculate_result&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1973_-_Hambar2&amp;diff=5794</id>
		<title>1973 - Hambar2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1973_-_Hambar2&amp;diff=5794"/>
		<updated>2023-05-03T06:28:33Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Enunț==&lt;br /&gt;
Prințesa Gîrcella este foarte frumoasă. Fiindcă a venit momentul să se mărite, foarte mulți feciori au venit să îi ceară mâna. Printre aceștia se află și Cavalerul de Aur, marele algoritmician. Gîrcella îl dorește pe cel mai inteligent, așa că le va pune o provocare. Grădina sa este o matrice pătratică binară (cu valori 0 sau 1), valorile 0 reprezintă teren liber iar valorile 1 reprezintă pomi. Cel ce va găsi suprafața dreptunghică de arie maximă ce conține doar valori 0, pe care va construi un hambar, va câștiga mâna frumoasei Gîrcella.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Ajutați-l pe Cavalerul de Aur să câștige această întrecere.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare hambar2.in conține pe prima linie numerele N și M, reprezentând dimensinunea matricei respectiv numărul de pomi, iar pe următoarele M linii se vor găsi două numere x și y, separate printr-un spațiu, reprezentând indicele liniei, respectiv al coloanei pe care se află un pom.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire hambar2.out va conține pe prima linie numărul S, reprezentând aria maximă a unei suprafețe dreptunghiulare.&lt;br /&gt;
În consolă se va afișa un mesaj de validare a datelor (&amp;quot;Input valid&amp;quot; sau instrucțiuni cu privire la n sau m).&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 ≤ N, M ≤ 1000&lt;br /&gt;
* Nu se vor afla 2 sau mai mulți pomi în același loc.&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; hambar2.in&lt;br /&gt;
: 5 5&lt;br /&gt;
: 1 3&lt;br /&gt;
: 2 1&lt;br /&gt;
: 2 5&lt;br /&gt;
: 5 1&lt;br /&gt;
: 5 5&lt;br /&gt;
:hambar2.out&lt;br /&gt;
: 12&lt;br /&gt;
; Consolă&lt;br /&gt;
: Valid input&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
nMAX = 1000&lt;br /&gt;
&lt;br /&gt;
def clear(stiva):&lt;br /&gt;
    while stiva:&lt;br /&gt;
        stiva.pop()&lt;br /&gt;
&lt;br /&gt;
def calculate_histogram(n, mat):&lt;br /&gt;
    h = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        for j in range(1, n+1):&lt;br /&gt;
            if not mat[i][j]:&lt;br /&gt;
                h[j] += 1&lt;br /&gt;
            else:&lt;br /&gt;
                h[j] = 0&lt;br /&gt;
&lt;br /&gt;
    return h&lt;br /&gt;
&lt;br /&gt;
def calculate_left_boundary(n, h):&lt;br /&gt;
    st = [0] * (n + 1)&lt;br /&gt;
    stiva = []&lt;br /&gt;
&lt;br /&gt;
    for j in range(1, n+1):&lt;br /&gt;
        while stiva and h[stiva[-1]] &amp;gt;= h[j]:&lt;br /&gt;
            stiva.pop()&lt;br /&gt;
&lt;br /&gt;
        if not stiva:&lt;br /&gt;
            st[j] = 0&lt;br /&gt;
        else:&lt;br /&gt;
            st[j] = stiva[-1]&lt;br /&gt;
&lt;br /&gt;
        stiva.append(j)&lt;br /&gt;
&lt;br /&gt;
    return st&lt;br /&gt;
&lt;br /&gt;
def calculate_right_boundary(n, h):&lt;br /&gt;
    dr = [0] * (n + 1)&lt;br /&gt;
    stiva = []&lt;br /&gt;
&lt;br /&gt;
    for j in range(n, 0, -1):&lt;br /&gt;
        while stiva and h[stiva[-1]] &amp;gt;= h[j]:&lt;br /&gt;
            stiva.pop()&lt;br /&gt;
&lt;br /&gt;
        if not stiva:&lt;br /&gt;
            dr[j] = n+1&lt;br /&gt;
        else:&lt;br /&gt;
            dr[j] = stiva[-1]&lt;br /&gt;
&lt;br /&gt;
        stiva.append(j)&lt;br /&gt;
&lt;br /&gt;
    return dr&lt;br /&gt;
&lt;br /&gt;
def calculate_max_rect(n, mat):&lt;br /&gt;
    arieMAX = 0&lt;br /&gt;
&lt;br /&gt;
    h = calculate_histogram(n, mat)&lt;br /&gt;
    st = calculate_left_boundary(n, h)&lt;br /&gt;
    dr = calculate_right_boundary(n, h)&lt;br /&gt;
&lt;br /&gt;
    for j in range(1, n+1):&lt;br /&gt;
        arieMAX = max(arieMAX, h[j] * (dr[j] - st[j] - 1))&lt;br /&gt;
&lt;br /&gt;
    return arieMAX&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, m):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 1000:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie să fie între 1 și 1000&amp;quot;)&lt;br /&gt;
        return 0&lt;br /&gt;
    if not 1 &amp;lt;= m &amp;lt;= 1000:&lt;br /&gt;
        raise ValueError(&amp;quot;m trebuie să fie între 1 și 1000&amp;quot;)&lt;br /&gt;
        return 0&lt;br /&gt;
    return 1&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;hambar2.in&#039;, &#039;r&#039;) as fin, open(&#039;hambar2.out&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        if validate_input(n, m):&lt;br /&gt;
            print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        mat = [[False] * (nMAX + 1) for _ in range(nMAX + 1)]&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y = map(int, fin.readline().split())&lt;br /&gt;
            mat[x][y] = True&lt;br /&gt;
&lt;br /&gt;
        fout.write(str(calculate_max_rect(n, mat)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest cod implementează o soluție pentru problema de a găsi cea mai mare suprafață a unui dreptunghi cu toate elementele sale nealbe într-o matrice dată de dimensiunea n x n. Mai precis, codul conține următoarele funcții:&lt;br /&gt;
&lt;br /&gt;
- Funcția &amp;quot;clear&amp;quot; golește conținutul unei stive date ca argument;&lt;br /&gt;
- Funcția &amp;quot;calculate_histogram&amp;quot; calculează histograma pentru matricea dată și returnează o listă de dimensiune n+1, unde primul element este 0 și următoarele elemente reprezintă înălțimea coloanelor corespunzătoare din matrice;&lt;br /&gt;
- Funcțiile &amp;quot;calculate_left_boundary&amp;quot; și &amp;quot;calculate_right_boundary&amp;quot; calculează limitele stângi, respectiv drepte ale dreptunghiurilor care conțin fiecare coloană din matricea dată și care au înălțimile date de histograma calculată anterior. Acestea returnează două liste de dimensiune n+1, unde primul și ultimul element sunt 0, iar restul elementelor reprezintă limitele stângi sau drepte corespunzătoare;&lt;br /&gt;
- Funcția &amp;quot;calculate_max_rect&amp;quot; calculează cea mai mare suprafață a unui dreptunghi cu toate elementele sale nealbe în matricea dată, folosind funcțiile &amp;quot;calculate_histogram&amp;quot;, &amp;quot;calculate_left_boundary&amp;quot; și &amp;quot;calculate_right_boundary&amp;quot;;&lt;br /&gt;
- Funcția &amp;quot;validate_input&amp;quot; verifică dacă valorile n și m sunt în intervalul [1, 1000] și generează o excepție în caz contrar.&lt;br /&gt;
&lt;br /&gt;
În secțiunea &amp;quot;if __name__ == &#039;__main__&#039;:&amp;quot; se deschide fișierul &amp;quot;hambar2.in&amp;quot; pentru citire și fișierul &amp;quot;hambar2.out&amp;quot; pentru scriere, se citește dimensiunea matricei și numărul de elemente albe din aceasta și se verifică dacă valorile introduse sunt valide. Dacă sunt, se construiește matricea folosind elementele citite și se apelează funcția &amp;quot;calculate_max_rect&amp;quot; pentru a calcula cea mai mare suprafață a unui dreptunghi cu toate elementele sale nealbe. Rezultatul este scris în fișierul &amp;quot;hambar2.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2225_-_complementar&amp;diff=5793</id>
		<title>2225 - complementar</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2225_-_complementar&amp;diff=5793"/>
		<updated>2023-05-03T06:24:26Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o matrice binară cu n linii și m coloane. Spunem că două linii L1, L2 din matrice sunt complementare dacă a[L1][j] ≠ a[L2][j], pentru orice j=1..m (adică acolo unde pe linia L1 este 0, pe linia L2 este 1 și invers).&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Să se determine numărul de perechi de linii (L1, L2) cu L1 &amp;lt; L2 cu proprietatea că sunt complementare.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare complementar.in conține pe prima linie numerele n și m. Pe următoarele n linii, fără spații între ele, sunt câte m de valori binare.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire complementar.out va conține un singur număr natural reprezentând numărul perechi de linii complementare.&lt;br /&gt;
În consolă se va afișa un mesaj de validare a datelor (&amp;quot;Input valid&amp;quot; sau &amp;quot;Input în afara limitelor&amp;quot; în funcție de datele introduse).&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 ≤ n ≤ 200 000&lt;br /&gt;
* 4 ≤ m ≤ 30&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; complementar.in&lt;br /&gt;
: 5 6&lt;br /&gt;
: 101001&lt;br /&gt;
: 010110&lt;br /&gt;
: 010110&lt;br /&gt;
: 111111&lt;br /&gt;
: 000000&lt;br /&gt;
; complementar.out&lt;br /&gt;
: 3&lt;br /&gt;
; Consolă&lt;br /&gt;
: Valid input&lt;br /&gt;
==Explicație==&lt;br /&gt;
Cele trei perechi de linii complementare sunt (1,2), (1,3) și (4,5).&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def read_input():&lt;br /&gt;
    with open(&#039;complementar.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
    return n, m&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, m):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 200000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (4 &amp;lt;= m &amp;lt;= 30):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def compute_model(m):&lt;br /&gt;
    model = 0&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        model += (1 &amp;lt;&amp;lt; i)&lt;br /&gt;
    return model&lt;br /&gt;
&lt;br /&gt;
def parse_binary(s):&lt;br /&gt;
    x = 0&lt;br /&gt;
    exponent = 0&lt;br /&gt;
    for j in range(len(s) - 1, -1, -1):&lt;br /&gt;
        if s[j] == &#039;1&#039;:&lt;br /&gt;
            x += (1 &amp;lt;&amp;lt; exponent)&lt;br /&gt;
        exponent += 1&lt;br /&gt;
    return x&lt;br /&gt;
&lt;br /&gt;
def read_data(n):&lt;br /&gt;
    p = {}&lt;br /&gt;
    with open(&#039;complementar.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        f.readline() # ignore first line&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            s = f.readline().strip()&lt;br /&gt;
            x = parse_binary(s)&lt;br /&gt;
            if x not in p:&lt;br /&gt;
                p[x] = 0&lt;br /&gt;
            p[x] += 1&lt;br /&gt;
    return p&lt;br /&gt;
&lt;br /&gt;
def compute_answer(p, model):&lt;br /&gt;
    ans = 0&lt;br /&gt;
    for e in p:&lt;br /&gt;
        y = (model ^ e)&lt;br /&gt;
        if y in p:&lt;br /&gt;
            ans += p[e] * p[y]&lt;br /&gt;
            p[y] = 0&lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def write_output(ans):&lt;br /&gt;
    with open(&#039;complementar.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(str(ans) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    n, m = read_input()&lt;br /&gt;
    if not validate_input(n, m):&lt;br /&gt;
        print(&amp;quot;Input în afara limitelor&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
    model = compute_model(m)&lt;br /&gt;
    p = read_data(n)&lt;br /&gt;
    ans = compute_answer(p, model)&lt;br /&gt;
    write_output(ans)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod este un program Python care citește date de intrare din fișierul &#039;complementar.in&#039;, validează aceste date, apoi citește date suplimentare și calculează un răspuns, pe care îl scrie în fișierul &#039;complementar.out&#039;.&lt;br /&gt;
&lt;br /&gt;
Funcția read_input() citește primele două valori din fișierul de intrare și le returnează ca o tuplă.&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input() primește cele două valori citite de funcția read_input() și verifică dacă sunt în limitele specificate. Dacă nu, funcția returnează False, altfel returnează True.&lt;br /&gt;
&lt;br /&gt;
Funcția compute_model() primește o valoare m și calculează un model folosind un loop for care construiește o valoare binară formată din m cifre de 1.&lt;br /&gt;
&lt;br /&gt;
Funcția parse_binary() primește o valoare binară sub forma unui șir de caractere și o convertește într-o valoare întreagă.&lt;br /&gt;
&lt;br /&gt;
Funcția read_data() citește datele suplimentare din fișierul de intrare și le stochează într-un dicționar, numărul de apariții ale fiecărei valori binare fiind valoarea asociată cu cheia binară în dicționar.&lt;br /&gt;
&lt;br /&gt;
Funcția compute_answer() primește dicționarul creat de funcția read_data() și modelul calculat de funcția compute_model(), calculează complementul fiecărei valori din dicționar și verifică dacă complementul este prezent în dicționar. Dacă este prezent, funcția calculează produsul numărului de apariții ale valorii inițiale și complementare și îl adaugă la răspuns. Funcția returnează răspunsul.&lt;br /&gt;
&lt;br /&gt;
Funcția write_output() primește răspunsul și îl scrie în fișierul de ieșire &#039;complementar.out&#039;.&lt;br /&gt;
&lt;br /&gt;
Funcția main() este funcția principală care apelează celelalte funcții pentru a citi datele de intrare, valida datele, calcula răspunsul și scrie răspunsul în fișierul de ieșire. Dacă datele de intrare nu sunt valide, funcția afișează un mesaj de eroare și returnează.&lt;br /&gt;
&lt;br /&gt;
Instrucțiunea if name == &#039;main&#039;: verifică dacă acest script este executat ca un program independent și, dacă este așa, apelează funcția main().&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2700_-_RadixSort&amp;diff=5792</id>
		<title>2700 - RadixSort</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2700_-_RadixSort&amp;diff=5792"/>
		<updated>2023-05-03T06:22:42Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Fiind dat un șir cu n elemente, nu neapărat distincte, se cere sortarea crescătoare a acestuia folosind metoda Radix Sort.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare radixsort.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 radixsort.out va conține pe prima linie n numere naturale, anume șirul sortat. În consolă se va scrie un mesaj de validare al input-ului(&amp;quot;Input valid!&amp;quot; sau &amp;quot;Input invalid!&amp;quot; după caz).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 2 &amp;amp;les; n &amp;amp;les; 1.000.000;&lt;br /&gt;
* numerele de pe a doua linie a fișierului de intrare vor avea maximum 9 cifre.&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; radixsort.in&lt;br /&gt;
: 8&lt;br /&gt;
: 170 20 45 75 90 802 24 2&lt;br /&gt;
; radixsort.out&lt;br /&gt;
: 2 20 24 45 75 90 170 802&lt;br /&gt;
; Ieșire consolă&lt;br /&gt;
: Input valid&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def getMax(n, arr):&lt;br /&gt;
    maxX = arr[0]&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if arr[i] &amp;gt; maxX:&lt;br /&gt;
            maxX = arr[i]&lt;br /&gt;
    return maxX&lt;br /&gt;
&lt;br /&gt;
def validateInput(n, arr):&lt;br /&gt;
    if n &amp;lt; 2 or n &amp;gt; 1000000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if abs(arr[i]) &amp;gt; 999999999:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def countingSort(n, exp, arr, output):&lt;br /&gt;
    count = [0] * 32&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        count[(arr[i]//exp)%32] += 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, 32):&lt;br /&gt;
        count[i] += count[i - 1]&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, -1, -1):&lt;br /&gt;
        output[count[(arr[i]//exp)%32] - 1] = arr[i]&lt;br /&gt;
        count[(arr[i]//exp)%32] -= 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        arr[i] = output[i]&lt;br /&gt;
&lt;br /&gt;
def radixSort(n, arr):&lt;br /&gt;
    m = getMax(n, arr)&lt;br /&gt;
&lt;br /&gt;
    output = [0] * n&lt;br /&gt;
&lt;br /&gt;
    exp = 1&lt;br /&gt;
    while m // exp &amp;gt; 0:&lt;br /&gt;
        countingSort(n, exp, arr, output)&lt;br /&gt;
        exp *= 32&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&amp;quot;radixsort.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        with open(&amp;quot;radixsort.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            n = int(fin.readline())&lt;br /&gt;
            arr = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
            if not validateInput(n, arr):&lt;br /&gt;
                print(&amp;quot;Input invalid!&amp;quot;)&lt;br /&gt;
                exit()&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;Input valid!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            radixSort(n, arr)&lt;br /&gt;
&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                fout.write(str(arr[i]) + &#039; &#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest cod implementează algoritmul de sortare radix sort pe o listă de întregi.&lt;br /&gt;
&lt;br /&gt;
Funcția `getMax(n, arr)` primește ca parametrii un număr întreg `n` și o listă de `n` întregi `arr`, și returnează cel mai mare element din listă.&lt;br /&gt;
&lt;br /&gt;
Funcția `validateInput(n, arr)` primește ca parametrii un număr întreg `n` și o listă de `n` întregi `arr`, și returnează `True` dacă input-ul este valid (adică `n` este între 2 și 1000000 și toți elementele din listă au valori absolute mai mici decât 999999999) și `False` altfel.&lt;br /&gt;
&lt;br /&gt;
Funcția `countingSort(n, exp, arr, output)` primește ca parametrii un număr întreg `n`, un număr întreg `exp`, o listă de `n` întregi `arr` și o listă de `n` întregi `output`. Implementează algoritmul de sortare counting sort pentru o cifră specifică (dată de `exp`), în baza 32. Folosește un array `count` de dimensiune 32 pentru a număra de câte ori apare fiecare cifră și apoi reordonează lista `arr` în ordinea specificată de cifra respectivă.&lt;br /&gt;
&lt;br /&gt;
Funcția `radixSort(n, arr)` primește ca parametrii un număr întreg `n` și o listă de `n` întregi `arr`. Implementează algoritmul de sortare radix sort, iterând prin fiecare cifră a numerelor și apelând funcția `countingSort` pentru fiecare cifră în parte, începând cu cifra cea mai puțin semnificativă.&lt;br /&gt;
&lt;br /&gt;
Funcția `__main__` citește input-ul din fișierul &amp;quot;radixsort.in&amp;quot;, validează input-ul folosind funcția `validateInput`, sortează lista de numere folosind `radixSort`, și afișează rezultatul în fișierul &amp;quot;radixsort.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1924_-_QStiva&amp;diff=5791</id>
		<title>1924 - QStiva</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1924_-_QStiva&amp;diff=5791"/>
		<updated>2023-05-03T06:18:43Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă o stivă inițial vidă. Să se efectueze Q operații de forma:&lt;br /&gt;
&lt;br /&gt;
1 x: Se adaugă x în stivă.&lt;br /&gt;
2: Se șterge elementul din vârful stivei.&lt;br /&gt;
3 S: Se întreabă dacă se poate scrie valoarea S ca sumă de elemente aflate în stivă. Fiecare element poate fi folosit o singură dată în calcularea sumei. Răspunsul va fi 1 în caz afirmativ și 0 în caz negativ.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare qstiva.in conține pe prima linie numărul Q, iar pe următoarele Q linii se vor afla operațiile descrise mai sus.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire qstiva.out va conține răspunsurile operațiilor de tipul 3, câte un răspuns pe linie, în ordinea în care acestea apar în fișierul de intrare. În consolă se va afișa un mesaj de validare a datelor introduse în fișierul de intrare (&amp;quot;Input valid&amp;quot; sau &amp;quot;Input invalid&amp;quot; după caz).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; Q &amp;amp;les; 100000&lt;br /&gt;
* pentru o operație de tipul 1, 1 ≤ x ≤ 1000&lt;br /&gt;
* pentru o operație de tipul 3, 1 ≤ S ≤ 1000&lt;br /&gt;
* nu se vor efectua operații de tipul 2 sau de tipul 3 dacă stiva este goală.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; qstiva.in&lt;br /&gt;
&lt;br /&gt;
: 8&lt;br /&gt;
: 1 12&lt;br /&gt;
: 2&lt;br /&gt;
: 1 1&lt;br /&gt;
: 3 2&lt;br /&gt;
: 1 2&lt;br /&gt;
: 1 12&lt;br /&gt;
: 3 13&lt;br /&gt;
: 2&lt;br /&gt;
; qstiva.out&lt;br /&gt;
: 0&lt;br /&gt;
: 1&lt;br /&gt;
; Ieșire consolă&lt;br /&gt;
: Input valid&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
from typing import List&lt;br /&gt;
from bitarray import bitarray&lt;br /&gt;
&lt;br /&gt;
nmax = 100001&lt;br /&gt;
Smax = 1000&lt;br /&gt;
&lt;br /&gt;
def validate_input(queries: List[List[int]]) -&amp;gt; bool:&lt;br /&gt;
    if not 1 &amp;lt;= len(queries) &amp;lt;= 100000:&lt;br /&gt;
        return False&lt;br /&gt;
    stack_size = 0&lt;br /&gt;
    for query in queries:&lt;br /&gt;
        t = query[0]&lt;br /&gt;
        if t == 1:&lt;br /&gt;
            x = query[1]&lt;br /&gt;
            if not 1 &amp;lt;= x &amp;lt;= 1000:&lt;br /&gt;
                return False&lt;br /&gt;
            stack_size += 1&lt;br /&gt;
        elif t == 2:&lt;br /&gt;
            if stack_size == 0:&lt;br /&gt;
                return False&lt;br /&gt;
            stack_size -= 1&lt;br /&gt;
        elif t == 3:&lt;br /&gt;
            x = query[1]&lt;br /&gt;
            if not 1 &amp;lt;= x &amp;lt;= 1000:&lt;br /&gt;
                return False&lt;br /&gt;
            if stack_size == 0:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def read_input() -&amp;gt; List[List[int]]:&lt;br /&gt;
    with open(&amp;quot;qstiva.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        Q = int(fin.readline().strip())&lt;br /&gt;
        queries = []&lt;br /&gt;
        for _ in range(Q):&lt;br /&gt;
            query = list(map(int, fin.readline().split()))&lt;br /&gt;
            queries.append(query)&lt;br /&gt;
        if not validate_input(queries):&lt;br /&gt;
            raise ValueError(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
        return queries&lt;br /&gt;
&lt;br /&gt;
def solve_queries(queries: List[List[int]]) -&amp;gt; List[int]:&lt;br /&gt;
    n = 0&lt;br /&gt;
    dp = [bitarray(Smax+2) for _ in range(nmax)]&lt;br /&gt;
    dp[0][0] = 1&lt;br /&gt;
    ans = []&lt;br /&gt;
    for query in queries:&lt;br /&gt;
        t = query[0]&lt;br /&gt;
        if t == 1:&lt;br /&gt;
            x = query[1]&lt;br /&gt;
            n += 1&lt;br /&gt;
            dp[n].setall(False)&lt;br /&gt;
            for i in range(Smax-x+1, Smax+1):&lt;br /&gt;
                dp[n][i] = dp[n-1][i]&lt;br /&gt;
            for i in range(Smax-x, -1, -1):&lt;br /&gt;
                if dp[n-1][i]:&lt;br /&gt;
                    dp[n][i+x] = dp[n][i] = True&lt;br /&gt;
        elif t == 2:&lt;br /&gt;
            n -= 1&lt;br /&gt;
        elif t == 3:&lt;br /&gt;
            x = query[1]&lt;br /&gt;
            ans.append(int(dp[n][x]))&lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def write_output(ans: List[int]) -&amp;gt; None:&lt;br /&gt;
    with open(&amp;quot;qstiva.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for a in ans:&lt;br /&gt;
            fout.write(str(a) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    try:&lt;br /&gt;
        queries = read_input()&lt;br /&gt;
        print(&amp;quot;Input valid&amp;quot;, file=sys.stdout)&lt;br /&gt;
    except ValueError as e:&lt;br /&gt;
        print(e, file=sys.stderr)&lt;br /&gt;
        sys.exit(1)&lt;br /&gt;
    ans = solve_queries(queries)&lt;br /&gt;
    write_output(ans)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Funcția validate_input verifică dacă input-ul este valid, adică dacă este în conformitate cu restricțiile problemei. Funcția read_input citește input-ul din fișierul &amp;quot;qstiva.in&amp;quot; și îl validează folosind funcția validate_input. Funcția solve_queries primește input-ul validat și rezolvă problema &amp;quot;Q-Stack&amp;quot; utilizând tehnica de programare dinamică. Funcția write_output scrie rezultatul în fișierul &amp;quot;qstiva.out&amp;quot;. Funcția main este funcția principală care apelează celelalte funcții în ordine pentru a citi input-ul, a rezolva problema și a scrie rezultatul.&lt;br /&gt;
&lt;br /&gt;
Algoritmul utilizează o matrice dp de dimensiuni nmax x Smax+2, unde dp[i][j] este True dacă există un subsir de lungime i cu o sumă de elemente egală cu j. Matricea este inițializată cu dp[0][0] = True, pentru că există un subsir de lungime zero cu suma elementelor zero. Algoritmul primește trei tipuri de interogări:&lt;br /&gt;
&lt;br /&gt;
Adaugă elementul x la stack.&lt;br /&gt;
Elimină ultimul element adăugat la stack.&lt;br /&gt;
Verifică dacă există un subsir de elemente care au o sumă egală cu x.&lt;br /&gt;
Pentru fiecare interogare de tipul 1, se creează un nou rând în matricea dp, inițializat cu False. Pentru fiecare element i din matricea anterioară care are valoarea True, se actualizează valorile dp[n][i+x] și dp[n][i] pe baza valorii anterioare dp[n-1][i].&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare interogare de tipul 2, se elimină ultimul rând din matricea dp.&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare interogare de tipul 3, se verifică dacă există un subsir de elemente din stack care au o sumă egală cu x. Dacă da, se adaugă 1 în lista de rezultate ans, altfel se adaugă 0.&lt;br /&gt;
&lt;br /&gt;
În final, lista de rezultate este scrisă în fișierul &amp;quot;qstiva.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1899_-_AfisMinime&amp;diff=5790</id>
		<title>1899 - AfisMinime</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1899_-_AfisMinime&amp;diff=5790"/>
		<updated>2023-05-03T06:16:24Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un vector cu n elemente, numere naturale. Fie două numere x și y, cu proprietatea că 1 ≤ x , y ≤ n.&lt;br /&gt;
&lt;br /&gt;
Scrieți un program care răspunde la m întrebări de tipul “Care este elementul minim din intervalul [x , y]?”.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Pe prima linie a fișierului afisminime.in sunt date numerele n și m. Pe a doua linie se vor afla n numere naturale, fiind elementele vectorului. Următoarele m linii vor conține câte 2 numere reprezentând valorile x și y, care definesc întrebările.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
În fișierul de ieșire afisminime.out, se va afișa un mesaj de validare a datelor, după care vor fi m linii, fiecare conținând câte un număr, pe linia i aflându-se răspunsul pentru întrebarea i. Consola rămâne goală.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 ≤ n ≤ 100.000&lt;br /&gt;
* 1 ≤ m ≤ 1.000.000&lt;br /&gt;
* 1 ≤ x , y ≤ n&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; afisminime.in&lt;br /&gt;
: 5 4&lt;br /&gt;
: 1 3 18 2 3&lt;br /&gt;
: 1 5&lt;br /&gt;
: 2 3&lt;br /&gt;
: 3 4&lt;br /&gt;
: 2 4&lt;br /&gt;
; afisminime.out&lt;br /&gt;
: Input valid&lt;br /&gt;
: 1&lt;br /&gt;
: 3&lt;br /&gt;
: 2&lt;br /&gt;
: 2&lt;br /&gt;
==Explicație==&lt;br /&gt;
în intervalul [1 , 5] minimul este 1&lt;br /&gt;
în intervalul [2 , 3] minimul este 3&lt;br /&gt;
în intervalul [3 , 4] minimul este 2&lt;br /&gt;
în intervalul [2 , 4] minimul este 2&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
from typing import List&lt;br /&gt;
&lt;br /&gt;
def query(i: int, j: int, r: List[List[int]], lg2: List[int]) -&amp;gt; int:&lt;br /&gt;
    e = lg2[j - i + 1]&lt;br /&gt;
    p2 = 1 &amp;lt;&amp;lt; e&lt;br /&gt;
    return min(r[e][i + p2 - 1], r[e][j])&lt;br /&gt;
&lt;br /&gt;
def solve(n: int, q: int, arr: List[int]) -&amp;gt; List[int]:&lt;br /&gt;
    NMAX = 10 ** 5&lt;br /&gt;
    r = [[0] * (NMAX + 1) for _ in range(17)]&lt;br /&gt;
    lg2 = [-1] * (NMAX + 1)&lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        x = arr[i-1]&lt;br /&gt;
        r[0][i] = x&lt;br /&gt;
        lg2[i] = 1 + lg2[i &amp;gt;&amp;gt; 1]&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, lg2[n] + 1):&lt;br /&gt;
        for j in range(1 &amp;lt;&amp;lt; i, n + 1):&lt;br /&gt;
            r[i][j] = min(r[i - 1][j - (1 &amp;lt;&amp;lt; (i - 1))], r[i - 1][j])&lt;br /&gt;
    &lt;br /&gt;
    for i in range(q):&lt;br /&gt;
        x, y = map(int, input().split())&lt;br /&gt;
        res.append(query(x, y, r, lg2))&lt;br /&gt;
        &lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
def validate(n: int, q: int, arr: List[int]) -&amp;gt; bool:&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= q &amp;lt;= 1000000):&lt;br /&gt;
        return False&lt;br /&gt;
    for i in arr:&lt;br /&gt;
        if not (1 &amp;lt;= i &amp;lt;= n):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # Input and output files&lt;br /&gt;
    sys.stdin = open(&#039;afisminime.in&#039;, &#039;r&#039;)&lt;br /&gt;
    sys.stdout = open(&#039;afisminime.out&#039;, &#039;w&#039;)&lt;br /&gt;
    &lt;br /&gt;
    n, q = map(int, input().split())&lt;br /&gt;
    arr = [int(input()) for i in range(n)]&lt;br /&gt;
    &lt;br /&gt;
    if not validate(n, q, arr):&lt;br /&gt;
        print(&amp;quot;Input invalid&amp;quot;)&lt;br /&gt;
        sys.exit()&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
    res = solve(n, q, arr)&lt;br /&gt;
    for r in res:&lt;br /&gt;
        print(r)&lt;br /&gt;
        &lt;br /&gt;
    sys.stdin.close()&lt;br /&gt;
    sys.stdout.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie cod==&lt;br /&gt;
Acest cod Python definește trei funcții și un validator de intrare pentru a rezolva o problemă specifică de programare.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;query&amp;quot; primește ca parametri o pereche de numere întregi și două liste de întregi. Scopul acestei funcții este de a returna valoarea minimă din intervalul inclus între cele două numere întregi în prima listă, utilizând informațiile stocate în a doua listă.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;solve&amp;quot; primește ca parametri un număr întreg n, un număr întreg q și o listă de întregi. Scopul acestei funcții este de a rezolva problema specifică de programare, unde trebuie să găsești valoarea minimă dintr-un interval de elemente din lista dată. Aceasta construiește o matrice pentru a memora informațiile necesare, apoi calculează valorile minime pentru fiecare interval de dimensiuni diferite, folosind funcția &amp;quot;query&amp;quot;, și le stochează într-o listă numită &amp;quot;res&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;validate&amp;quot; primește ca parametri același tip de date ca funcția &amp;quot;solve&amp;quot;. Scopul acestei funcții este de a verifica dacă input-ul dat este valid pentru problema specifică de programare. Aceasta verifică dacă dimensiunile listei de intrare și a intervalului sunt în limitele permise și dacă toate elementele din lista de intrare sunt cuprinse în intervalul de la 1 la n.&lt;br /&gt;
&lt;br /&gt;
În blocul &amp;quot;if name == &amp;quot;main&amp;quot;:&amp;quot;, codul deschide fișierele de intrare și ieșire, citeste input-ul, verifică dacă input-ul este valid și apelează funcția &amp;quot;solve&amp;quot; dacă input-ul este valid. În cele din urmă, funcția &amp;quot;solve&amp;quot; afișează output-ul în fișierul de ieșire și închide fișierele de intrare și ieșire.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4206_-_CifDiv3Rec&amp;diff=5789</id>
		<title>4206 - CifDiv3Rec</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4206_-_CifDiv3Rec&amp;diff=5789"/>
		<updated>2023-05-03T06:10:56Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Să se scrie o funcție Python recursivă care să returneze numărul cifrelor divizibile cu 3 ale unui număr natural n transmis ca parametru.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Numele funcției va fi CifDiv3Rec&lt;br /&gt;
* Funcția va avea un parametru reprezentând numărul dat n&lt;br /&gt;
* 0 &amp;amp;les; n &amp;amp;les; 2.000.000.000&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;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt corecte.&amp;quot;, apoi pe un rând nou un mesaj dat în funcție de valoarea returnată de funcția CifDiv3Rec, reprezentând numărul cerut. În cazul în care numărul introdus depășește limitele date, se va afișa &amp;quot;Numarul introdus nu este valid.&amp;quot;, iar dacă numărul introdus nu este întreg, se va afișa &amp;quot;Nu ati introdus un numar intreg.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceți un număr întreg pozitiv: 2009376&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: Numărul de cifre divizibile cu 3 din numărul introdus este: 5&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_n(n):&lt;br /&gt;
    if isinstance(n, int) and n &amp;gt;= 0 and n &amp;lt;= 2_000_000_000:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def CifDiv3Rec(n):&lt;br /&gt;
    if n == 0:&lt;br /&gt;
        return 0&lt;br /&gt;
    elif n % 10 % 3 == 0:&lt;br /&gt;
        return 1 + CifDiv3Rec(n // 10)&lt;br /&gt;
    else:&lt;br /&gt;
        return CifDiv3Rec(n // 10)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = input(&amp;quot;Introduceți un număr întreg pozitiv: &amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(n)&lt;br /&gt;
        if validate_n(n):&lt;br /&gt;
            result = CifDiv3Rec(n)&lt;br /&gt;
            print(&amp;quot;Datele introduse sunt corecte.&amp;quot;)&lt;br /&gt;
            if result == 0:&lt;br /&gt;
                print(&amp;quot;Nu există cifre divizibile cu 3 în numărul introdus.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(f&amp;quot;Numărul de cifre divizibile cu 3 din numărul introdus este: {result}&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Numărul introdus nu este valid.&amp;quot;)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Nu ați introdus un număr întreg.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest cod este scris în Python și este alcătuit din două funcții și o secvență de cod care le utilizează. &lt;br /&gt;
&lt;br /&gt;
Funcția `validate_n(n)` primește un singur argument, `n`, și verifică dacă acesta este un număr întreg pozitiv în intervalul [0, 2_000_000_000]. Funcția returnează `True` dacă `n` este valid și `False` altfel. &lt;br /&gt;
&lt;br /&gt;
Funcția `CifDiv3Rec(n)` primește un singur argument, `n`, și returnează numărul de cifre divizibile cu 3 din numărul `n`. Funcția face acest lucru recursiv prin împărțirea numărului la 10 (pentru a elimina ultima cifră) și verificarea dacă acea cifră este divizibilă cu 3. Dacă este divizibilă, funcția adaugă 1 la rezultat și continuă recursiv cu restul numărului. Dacă cifra nu este divizibilă cu 3, funcția continuă recursiv cu restul numărului. Când numărul devine 0, recursivitatea se oprește și funcția returnează rezultatul acumulat.&lt;br /&gt;
&lt;br /&gt;
În secvența de cod care utilizează aceste funcții, utilizatorul este întâi rugat să introducă un număr întreg pozitiv. Acest număr este apoi validat prin apelarea funcției `validate_n(n)`. Dacă numărul este valid, este apelată funcția `CifDiv3Rec(n)` pentru a calcula numărul de cifre divizibile cu 3 din numărul introdus. Dacă rezultatul este 0, se afișează un mesaj corespunzător, altfel se afișează numărul de cifre divizibile cu 3 găsite. Dacă numărul introdus nu este valid sau nu este un număr întreg, se afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1240_-_Ab3&amp;diff=5788</id>
		<title>1240 - Ab3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1240_-_Ab3&amp;diff=5788"/>
		<updated>2023-05-03T06:09:17Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Să se determine pentru n numere a valoarea b maximă astfel încât b&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + b &amp;amp;les; a.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Datele de intrare conțin pe prima linie numărul n, iar pe următoarele n linii câte un număr a.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Datele de ieșire vor conține n linii cu câte un număr fiecare, răspunsul la fiecare întrebare, pe lângă mesajul de validare a datelor introduse (&amp;quot;Date de intrare valide&amp;quot; pentru date valide, &amp;quot;Date de intrare invalide&amp;quot; în vaz contrar).&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 100.000&lt;br /&gt;
* 0 &amp;amp;les; a &amp;amp;les; 10&amp;lt;sup&amp;gt;18&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 5&lt;br /&gt;
: 1 &lt;br /&gt;
: 9 &lt;br /&gt;
: 36&lt;br /&gt;
: 27&lt;br /&gt;
: 89&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 0&lt;br /&gt;
: 1&lt;br /&gt;
: 3&lt;br /&gt;
: 2&lt;br /&gt;
: 4&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
: 13 + 1 = 2&lt;br /&gt;
: 23 + 2 = 10&lt;br /&gt;
: 33 + 3 = 30&lt;br /&gt;
: 43 + 4 = 68&lt;br /&gt;
: 53 + 5 = 130&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(n, values):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 100000:&lt;br /&gt;
        return False&lt;br /&gt;
    for value in values:&lt;br /&gt;
        if value &amp;lt; 0 or value &amp;gt; 10**18:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def solve_problem(n, values):&lt;br /&gt;
    st = 1 &amp;lt;&amp;lt; 19&lt;br /&gt;
    results = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        a = values[i]&lt;br /&gt;
        b = 0&lt;br /&gt;
        for step in range(st, 0, -1):&lt;br /&gt;
            if (b + step) * (b + step) * (b + step) + (b + step) &amp;lt;= a:&lt;br /&gt;
                b += step&lt;br /&gt;
        results.append(str(b))&lt;br /&gt;
    return results&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    values = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        values.append(int(input()))&lt;br /&gt;
&lt;br /&gt;
    if validate_input(n, values):&lt;br /&gt;
        print(&amp;quot;Date de intrare valide&amp;quot;)&lt;br /&gt;
        results = solve_problem(n, values)&lt;br /&gt;
        for result in results:&lt;br /&gt;
            print(result)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Această bucată de cod are două funcții principale:&lt;br /&gt;
&lt;br /&gt;
1. Funcția `validate_input(n, values)`: Această funcție primește doi parametri: un număr întreg `n` și o listă de numere întregi `values`. Funcția verifică dacă `n` este în intervalul [1, 100000] și dacă fiecare valoare din lista `values` este în intervalul [0, 10^18]. Dacă oricare dintre aceste condiții nu este îndeplinită, funcția returnează `False`. În caz contrar, returnează `True`.&lt;br /&gt;
&lt;br /&gt;
2. Funcția `solve_problem(n, values)`: Această funcție primește doi parametri: un număr întreg `n` și o listă de numere întregi `values`. Funcția rezolvă o problemă specifică și returnează o listă de șiruri de caractere. Pentru fiecare valoare `a` din lista `values`, funcția calculează cel mai mare număr întreg `b` pentru care `(b + step) ^ 3 + (b + step) &amp;lt;= a` pentru un anumit interval de `step`. Rezultatul final este o listă de șiruri de caractere, care reprezintă valorile pentru fiecare `b` calculat pentru fiecare valoare `a`. &lt;br /&gt;
&lt;br /&gt;
În funcția principală, se citește întâi numărul `n` și valorile asociate. Dacă valorile sunt valide (verificate prin apelul funcției `validate_input(n, values)`), atunci se afișează &amp;quot;Date de intrare valide&amp;quot;. Apoi, se calculează rezultatele prin apelul funcției `solve_problem(n, values)` și se afișează. În caz contrar, se afișează &amp;quot;Date de intrare invalide&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3489_-_Numara_punctele&amp;diff=5787</id>
		<title>3489 - Numara punctele</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3489_-_Numara_punctele&amp;diff=5787"/>
		<updated>2023-05-03T06:07:39Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Considerăm o suprață plană în formă de pătrat având latura de 100 de unități și două mulțimi:&lt;br /&gt;
* Mulțimea P de puncte având coordonatele numere reale pozitive mai mici decat 100 (deci aparținând pătratului).&lt;br /&gt;
* Mulțimea ordonată C de cercuri având centrul în același pătrat și cu raza variabilă (se poate întâmpla ca centrul să fie în punctul p(1,1) și cercul să aibă raza de 3, deci să aibă o porțiune înafara pătratului).&lt;br /&gt;
&lt;br /&gt;
Se dorește să se stabilească, pentru fiecare dintre cercurile din mulțimea C, câte puncte din mulțimea P se află în interior (sau pe marginea acestuia).&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n de puncte, iar apoi n cupluri de numere reale, separate prin spații reprezentând coordonatele fiecărui punct. După ce a citit valorile reprezentând coordonatele punctelor, se va citi numărul m de cercuri și vor apoi cele m triplete reprezentând coordonatele centrului cercului respectiv raza cercului.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
În cazul în care datele sunt valide, se va afișa un mesaj de confirmare (&amp;quot;Datele introduse sunt corecte.&amp;quot;; &amp;quot;Unul sau mai multe numere introduse nu sunt valide.&amp;quot; se va afișa în caz contrar), iar pentru fiecare cerc citit se va afișa pe câte o linie diferită câte puncte sunt in interiorul său sau pe frontieră. În caz contrar, se va afișa un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1≤n≤100000&lt;br /&gt;
* Pentru fiecare punct p(x,y) avem x∈[0,100] respectiv y∈[0,100]&lt;br /&gt;
* 1≤m≤10000&lt;br /&gt;
* Pentru fiecare cerc c(x,y,r) avem x∈[0,100], y∈[0,100] și r∈[0,30]&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 3&lt;br /&gt;
: 6.39 24.96&lt;br /&gt;
: 6.23 6.17&lt;br /&gt;
: 20.0 20.0&lt;br /&gt;
: 3&lt;br /&gt;
: 23.05 83 10.57&lt;br /&gt;
: 15.00 15.00 10.0&lt;br /&gt;
: 10.0 20.0 10&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: 0&lt;br /&gt;
: 1&lt;br /&gt;
: 2&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validare(n: int, puncte: list[tuple[float, float]], m: int, cercuri: list[tuple[float, float, float]]) -&amp;gt; bool:&lt;br /&gt;
    # verificam numarul de puncte si de cercuri&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 100000 or not 1 &amp;lt;= m &amp;lt;= 10000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # verificam coordonatele punctelor si ale cercurilor&lt;br /&gt;
    for p in puncte:&lt;br /&gt;
        if not 0 &amp;lt;= p[0] &amp;lt;= 100 or not 0 &amp;lt;= p[1] &amp;lt;= 100:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    for c in cercuri:&lt;br /&gt;
        if not 0 &amp;lt;= c[0] &amp;lt;= 100 or not 0 &amp;lt;= c[1] &amp;lt;= 100 or c[2] &amp;lt;= 0:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_puncte_in_cercuri(puncte, cercuri):&lt;br /&gt;
    numar_puncte = []&lt;br /&gt;
    for cerc in cercuri:&lt;br /&gt;
        num_puncte_in_cerc = 0&lt;br /&gt;
        for punct in puncte:&lt;br /&gt;
            distanta = ((punct[0] - cerc[0]) ** 2 + (punct[1] - cerc[1]) ** 2) ** 0.5&lt;br /&gt;
            if distanta &amp;lt;= cerc[2]:&lt;br /&gt;
                num_puncte_in_cerc += 1&lt;br /&gt;
        numar_puncte.append(num_puncte_in_cerc)&lt;br /&gt;
    return numar_puncte&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # citirea numarului de puncte&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    # citirea coordonatelor fiecarui punct&lt;br /&gt;
    puncte = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        x, y = input().split()&lt;br /&gt;
        x = float(x)&lt;br /&gt;
        y = float(y)&lt;br /&gt;
        puncte.append((x, y))&lt;br /&gt;
    # citirea numarului de cercuri&lt;br /&gt;
    m = int(input())&lt;br /&gt;
    # citirea coordonatelor si razei fiecarui cerc&lt;br /&gt;
    cercuri = []&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        x, y, r = input().split()&lt;br /&gt;
        x = float(x)&lt;br /&gt;
        y = float(y)&lt;br /&gt;
        r = float(r)&lt;br /&gt;
        cercuri.append((x, y, r))&lt;br /&gt;
    # validarea datelor introduse&lt;br /&gt;
    if validare(n, puncte, m, cercuri):&lt;br /&gt;
        print(&amp;quot;Datele introduse sunt corecte.&amp;quot;)&lt;br /&gt;
        # numarul de puncte din interiorul fiecarui cerc&lt;br /&gt;
        numar_puncte = numar_puncte_in_cercuri(puncte, cercuri)&lt;br /&gt;
        # afisarea numarului de puncte din interiorul fiecarui cerc&lt;br /&gt;
        for i in numar_puncte:&lt;br /&gt;
            print(i)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Unul sau mai multe numere introduse nu sunt valide.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest cod are două funcții definite și o secțiune principală de cod. &lt;br /&gt;
&lt;br /&gt;
Funcția `validare` primește ca argumente un număr întreg `n`, o listă de perechi de coordonate (x,y) reprezentând punctele și un număr întreg `m` și o listă de tupluri (x,y,r) reprezentând cercurile. Funcția verifică dacă numărul de puncte și cercuri este în limitele permise și dacă coordonatele și razele cercurilor sunt valide (în intervalul 0-100). În cazul în care aceste condiții nu sunt îndeplinite, funcția returnează `False`, altfel returnează `True`.&lt;br /&gt;
&lt;br /&gt;
Funcția `numar_puncte_in_cercuri` primește ca argumente lista de puncte și cea de cercuri și returnează o listă cu numărul de puncte din fiecare cerc.&lt;br /&gt;
&lt;br /&gt;
În secțiunea principală de cod, mai întâi se citește numărul de puncte, apoi coordonatele fiecărui punct, apoi numărul de cercuri și coordonatele și razele acestora. După aceea se validează datele introduse. În cazul în care sunt valide, se afișează mesajul &amp;quot;Datele introduse sunt corecte.&amp;quot; și se calculează numărul de puncte din fiecare cerc cu ajutorul funcției `numar_puncte_in_cercuri`, iar apoi se afișează numărul de puncte din fiecare cerc. În caz contrar, se afișează mesajul &amp;quot;Unul sau mai multe numere introduse nu sunt valide.&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2716_-_UnuDoi&amp;diff=5786</id>
		<title>2716 - UnuDoi</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2716_-_UnuDoi&amp;diff=5786"/>
		<updated>2023-05-03T06:03:13Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se dă operația &amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;x&amp;lt;/SPAN&amp;gt;:{1,2}→{1,2} astfel încât  &amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;1&amp;lt;/SPAN&amp;gt;=2 și  &amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;2&amp;lt;/SPAN&amp;gt;=1. Operația se poate extinde asupra oricărei secvențe formate cu cifre de 1 și 2, de exemplu  &amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;121121212&amp;lt;/SPAN&amp;gt;=212212121.&lt;br /&gt;
&lt;br /&gt;
Se consideră șirul infinit s format cu cifre de 1 și 2, generat incremental prin extindere, după următoarea regulă de concatenare:&lt;br /&gt;
&lt;br /&gt;
* s1=1221&lt;br /&gt;
* s2=1221211221121221&lt;br /&gt;
* …&lt;br /&gt;
* sk+1=s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;SPAN STYLE=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;/SPAN&amp;gt;s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, pentru orice număr natural k.&lt;br /&gt;
==Cerința==&lt;br /&gt;
Dându-se un număr natural n, să se determine a n-a cifră a șirului infinit s.&lt;br /&gt;
&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;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran un mesaj de validare a datelor (&amp;quot;Date de intrare valide&amp;quot; pentru date valide; &amp;quot;Valoarea lui n trebuie sa fie intre 1 si 10^8&amp;quot; dacă n depășește valorile cerute) și a n-a cifră a șirului s.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceti valoarea lui n: 11&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 1&lt;br /&gt;
;Intrare&lt;br /&gt;
: Introduceti valoarea lui n: 20&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 2&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 10**8:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def calculate_k(n):&lt;br /&gt;
    k = 1&lt;br /&gt;
    while n &amp;gt;= 4:&lt;br /&gt;
        if n % 4 == 2 or n % 4 == 3:&lt;br /&gt;
            k = 3 - k&lt;br /&gt;
        if n % 4 != 0:&lt;br /&gt;
            n = n // 4 + 1&lt;br /&gt;
        else:&lt;br /&gt;
            n = n // 4&lt;br /&gt;
    if n % 4 == 2 or n % 4 == 3:&lt;br /&gt;
        k = 3 - k&lt;br /&gt;
    return k&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti valoarea lui n: &amp;quot;))&lt;br /&gt;
    if validate_input(n):&lt;br /&gt;
        print(&amp;quot;Date de intrare valide&amp;quot;)&lt;br /&gt;
        k = calculate_k(n)&lt;br /&gt;
        print(k)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Valoarea lui n trebuie sa fie intre 1 si 10^8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Acest cod Python definește două funcții și le folosește pentru a calcula o valoare k în funcție de valoarea introdusă de utilizator pentru n.&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input primește un argument n și returnează True dacă n se află în intervalul [1, 10^8], altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția calculate_k primește un argument n și calculează o valoare k folosind o serie de condiții. În esență, funcția împarte repetat valoarea n la 4 și schimbă valoarea lui k în funcție de restul împărțirii lui n la 4. Aceasta se repetă până când n devine mai mic decât 4.&lt;br /&gt;
&lt;br /&gt;
În funcția principală, utilizatorul este întâmpinat cu un prompt și îi este cerut să introducă o valoare pentru n. Dacă valoarea este validă, funcția calculate_k este apelată cu n ca argument și valoarea rezultată pentru k este afișată. Dacă valoarea n este invalidă, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3050_-_ncif&amp;diff=5785</id>
		<title>3050 - ncif</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3050_-_ncif&amp;diff=5785"/>
		<updated>2023-05-03T05:59:23Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Fie n un numar natural.&lt;br /&gt;
Pentru n seturi de doua numere naturale a si b, sa se afiseze cate cifre are a&amp;lt;sup&amp;gt;b&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare ncif.in conține pe prima linie numărul n, iar pe urmatoarele n linii cate doua numere naturale a si b separate prin spații.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire ncif.out va conține un mesaj de validare a datelor (&amp;quot;Date de intrare valide&amp;quot;), și pe fiecare linie următoare un număr reprezentând câte cifre are a&amp;lt;sup&amp;gt;b&amp;lt;/sup&amp;gt;. În cazul în care a sau b depășesc limitele date, se va afișa &amp;quot;a și b trebuie să fie între 0 și 100000&amp;quot;. Consola va rămâne goală, întrucât mesajul de validare apare în fișier.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 10.000&lt;br /&gt;
* 0 &amp;amp;les; a, b &amp;amp;les; 100.000&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; ncif.in&lt;br /&gt;
: 4&lt;br /&gt;
: 1 1&lt;br /&gt;
: 2 10&lt;br /&gt;
: 3 9&lt;br /&gt;
: 100 100&lt;br /&gt;
; ncif.out&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 1&lt;br /&gt;
: 4&lt;br /&gt;
: 5&lt;br /&gt;
: 201&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from math import log10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculeaza_numar_cifre(a: int, b: int) -&amp;gt; int:&lt;br /&gt;
    if not (0 &amp;lt;= a &amp;lt;= 100000 and 0 &amp;lt;= b &amp;lt;= 100000):&lt;br /&gt;
        raise ValueError(&amp;quot;a și b trebuie să fie între 0 și 100000&amp;quot;)&lt;br /&gt;
    return int(b * log10(a)) + 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def proceseaza_intrari(n: int, intrari: list) -&amp;gt; list:&lt;br /&gt;
    rezultate = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        a, b = intrari[i]&lt;br /&gt;
        rezultate.append(calculeaza_numar_cifre(a, b))&lt;br /&gt;
    return rezultate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scrie_fisier_iesire(nume_fisier: str, rezultate: list, valid: bool):&lt;br /&gt;
    with open(nume_fisier, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        if valid:&lt;br /&gt;
            print(&amp;quot;Date de intrare valide&amp;quot;, file=f)&lt;br /&gt;
        for r in rezultate:&lt;br /&gt;
            print(r, file=f)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;ncif.in&amp;quot;) as f:&lt;br /&gt;
        n = int(next(f))&lt;br /&gt;
        intrari = [list(map(int, next(f).split())) for _ in range(n)]&lt;br /&gt;
    rezultate = proceseaza_intrari(n, intrari)&lt;br /&gt;
    scrie_fisier_iesire(&amp;quot;ncif.out&amp;quot;, rezultate, True)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Acest program primește un fișier de intrare &amp;quot;ncif.in&amp;quot;, care conține un număr n și n perechi de numere întregi a și b. Programul calculează numărul de cifre din b la puterea a și stochează rezultatele într-un fișier de ieșire &amp;quot;ncif.out&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;calculeaza_numar_cifre&amp;quot; primește două numere întregi a și b și calculează numărul de cifre din b la puterea a, utilizând formula logaritmică.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;proceseaza_intrari&amp;quot; primește numărul de intrări și lista de perechi de numere întregi a și b, apoi apelază funcția &amp;quot;calculeaza_numar_cifre&amp;quot; pentru fiecare pereche de numere și stochează rezultatele într-o listă &amp;quot;rezultate&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;scrie_fisier_iesire&amp;quot; primește numele fișierului de ieșire și listă de rezultate și scrie fiecare rezultat în fișierul de ieșire.&lt;br /&gt;
&lt;br /&gt;
În final, în blocul &amp;quot;main&amp;quot;, programul citește datele de intrare din fișierul &amp;quot;ncif.in&amp;quot;, procesează intrările și scrie rezultatele în fișierul &amp;quot;ncif.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3100_-_suma_perm_circ&amp;diff=5784</id>
		<title>3100 - suma perm circ</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3100_-_suma_perm_circ&amp;diff=5784"/>
		<updated>2023-05-03T05:55:05Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Scrieți un program care citește un număr natural n și care să calculeze și să afișeze suma S a tuturor numerelor obținute prin permutări circulare ale cifrelor lui n cu o poziție.&lt;br /&gt;
&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;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afișa pe ecran mesajul de validare (&amp;quot;Date de intrare valide&amp;quot;) și numărul S, reprezentând suma cerută.&lt;br /&gt;
În cazul în care datele nu sunt valide, se va afișa un mesaj corespunzător care descrie eroarea dată.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* n are cel mult 100.000 de cifre&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 165&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 1332&lt;br /&gt;
Numere obținute din 165 prin permutări circulare sunt 165, 651 și 516, iar suma lor este 1332.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;gt;&lt;br /&gt;
def validate_input(s):&lt;br /&gt;
    if len(s) &amp;gt; 100000:&lt;br /&gt;
        print(&amp;quot;Error: n are mai mult de 100000 de cifre&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    for c in s:&lt;br /&gt;
        if not c.isdigit():&lt;br /&gt;
            print(&amp;quot;Error: n trebuie să conțină doar cifre&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citire(A):&lt;br /&gt;
    s = input()&lt;br /&gt;
    if not validate_input(s):&lt;br /&gt;
        return&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Date de intrare valide&amp;quot;)&lt;br /&gt;
    l = len(s)&lt;br /&gt;
    for i in range(l-1, -1, -1):&lt;br /&gt;
        A[l-i] = int(s[i])&lt;br /&gt;
    A[0] = l&lt;br /&gt;
&lt;br /&gt;
def afisare(A):&lt;br /&gt;
    for i in range(A[0], 0, -1):&lt;br /&gt;
        print(A[i], end=&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
def prod(B, x):&lt;br /&gt;
    t = 0&lt;br /&gt;
    for i in range(1, B[0]+1):&lt;br /&gt;
        t = B[i] * x + t&lt;br /&gt;
        B[i] = t % 10&lt;br /&gt;
        t //= 10&lt;br /&gt;
    while t:&lt;br /&gt;
        B[0] += 1&lt;br /&gt;
        B[B[0]] = t % 10&lt;br /&gt;
        t //= 10&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    N = [0] * 100001&lt;br /&gt;
    S = [0] * 100001&lt;br /&gt;
    citire(N)&lt;br /&gt;
    S[0] = N[0]&lt;br /&gt;
    for i in range(1, N[0]+1):&lt;br /&gt;
        S[i] = 1&lt;br /&gt;
    sumcf = sum(N[1:N[0]+1])&lt;br /&gt;
    prod(S, sumcf)&lt;br /&gt;
    afisare(S)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest program efectuează următoarele operații:&lt;br /&gt;
&lt;br /&gt;
1. Funcția &amp;quot;validate_input(s)&amp;quot; primește un șir de caractere &amp;quot;s&amp;quot; și verifică dacă acesta are lungimea mai mică sau egală cu 100.000 și dacă toate caracterele din &amp;quot;s&amp;quot; sunt cifre. În cazul în care una dintre aceste condiții nu este îndeplinită, se afișează un mesaj de eroare și se returnează valoarea &amp;quot;False&amp;quot;, altfel se returnează valoarea &amp;quot;True&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
2. Funcția &amp;quot;citire(A)&amp;quot; primește un vector &amp;quot;A&amp;quot; și citește un șir de caractere &amp;quot;s&amp;quot; de la tastatură. Apoi, apelează funcția &amp;quot;validate_input(s)&amp;quot; pentru a verifica dacă șirul &amp;quot;s&amp;quot; este valid. Dacă acesta nu este valid, se încheie funcția, altfel se initializează vectorul &amp;quot;A&amp;quot; cu cifrele din &amp;quot;s&amp;quot; și se actualizează prima poziție a vectorului cu lungimea șirului &amp;quot;s&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
3. Funcția &amp;quot;afisare(A)&amp;quot; primește un vector &amp;quot;A&amp;quot; și afișează cifrele din vector în ordine inversă.&lt;br /&gt;
&lt;br /&gt;
4. Funcția &amp;quot;prod(B, x)&amp;quot; primește un vector &amp;quot;B&amp;quot; și un număr întreg &amp;quot;x&amp;quot; și efectuează înmulțirea vectorului &amp;quot;B&amp;quot; cu numărul &amp;quot;x&amp;quot;. Mai precis, se parcurge vectorul &amp;quot;B&amp;quot; și se înmulțește fiecare element cu &amp;quot;x&amp;quot;, ținând cont și de restul din împărțirea cu 10, iar rezultatul este reținut într-o variabilă &amp;quot;t&amp;quot;. Apoi, fiecare element din &amp;quot;B&amp;quot; este actualizat cu restul din împărțirea dintre produsul corespunzător și 10, iar variabila &amp;quot;t&amp;quot; este actualizată cu câtul împărțirii dintre produsul corespunzător și 10. Dacă variabila &amp;quot;t&amp;quot; mai are valoare, aceasta este adăugată la finalul vectorului &amp;quot;B&amp;quot;, iar prima poziție a vectorului este actualizată cu noua lungime a vectorului.&lt;br /&gt;
&lt;br /&gt;
5. În blocul principal de cod, se declară două vectori &amp;quot;N&amp;quot; și &amp;quot;S&amp;quot; cu o capacitate de 100.001 elemente și se inițializează cu valoarea 0. Se apelează funcția &amp;quot;citire(N)&amp;quot; pentru a citi un număr întreg mare de la tastatură și se inițializează vectorul &amp;quot;S&amp;quot; cu valorile 1 pe primele &amp;quot;N[0]&amp;quot; poziții. Se calculează suma cifrelor din numărul &amp;quot;N&amp;quot; și se stochează în variabila &amp;quot;sumcf&amp;quot;. Apoi, se apelează funcția &amp;quot;prod(S, sumcf)&amp;quot; pentru a efectua produsul dintre vectorul &amp;quot;S&amp;quot; și suma cifrelor. În final, se apelează funcția &amp;quot;afisare(S)&amp;quot; pentru a afișa rezultatul înmulțirii.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3223_-_Scobitoare&amp;diff=5783</id>
		<title>3223 - Scobitoare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3223_-_Scobitoare&amp;diff=5783"/>
		<updated>2023-05-03T05:52:22Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Lui Ion îi plac scobitorile. Norocul său a fost că black friday tocmai a venit și a cumpărat un număr infinit de scobitori (să zicem că o duce destul de bine). Ținând cont că are extrem de multe scobitori, el a vrut să se joace cu ele, așa că a creat un joc.&lt;br /&gt;
&lt;br /&gt;
La primul pas, el pune o singură scobitoare în mijlocul mesei. Începând cu al doilea pas, el pune câte o scobitoare la fiecare capăt liber al scobitorilor plasate până acum, astfel încât cele două scobitori sunt perpendiculare și mijlocul scobitorii noi se afla la vârful scobitorii vechi. Un vârf de scobitoare este liber dacă nu atinge o altă scobitoare.&lt;br /&gt;
&lt;br /&gt;
Determinați&lt;br /&gt;
: 1. Numărul de scobitori aflate pe masă la pasul N.&lt;br /&gt;
: 2. Numărul de scobitori care au fost adăugate la pasul N.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare scobitoare.in conține pe prima linie două numere: P, care va reprezenta cerința, și N, cu semnificația din enunț.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire scobitoare.out va conține pe prima linie mesajul de validare a datelor (&amp;quot;Date de intrare valide&amp;quot; sau &amp;quot;Date de intrare invalide&amp;quot;, în funcție de validitatea datelor), iar pe următorul rând numărul cerut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 1000&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; scobitoare.in&lt;br /&gt;
: 2 197&lt;br /&gt;
; scobitoare.out&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 60&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def T(n):&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        return 1&lt;br /&gt;
    elif n == 2:&lt;br /&gt;
        return 3&lt;br /&gt;
    elif n == 3:&lt;br /&gt;
        return 7&lt;br /&gt;
    elif n == 4:&lt;br /&gt;
        return 11&lt;br /&gt;
    else:&lt;br /&gt;
        Puterea = 0&lt;br /&gt;
        PutereDeDoi = 1&lt;br /&gt;
        while PutereDeDoi &amp;lt; n:&lt;br /&gt;
            Puterea += 1&lt;br /&gt;
            PutereDeDoi *= 2&lt;br /&gt;
&lt;br /&gt;
        if PutereDeDoi == n:&lt;br /&gt;
            return (int(math.pow(2, 2 * Puterea + 1)) + 1) // 3&lt;br /&gt;
        else:&lt;br /&gt;
            PutereDeDoi = PutereDeDoi // 2&lt;br /&gt;
            return T(PutereDeDoi) + 2 * T(n - PutereDeDoi) + T(n - PutereDeDoi + 1) - 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 1000:&lt;br /&gt;
        return False&lt;br /&gt;
    else:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_input():&lt;br /&gt;
    with open(&amp;quot;scobitoare.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        p = int(f.readline())&lt;br /&gt;
        n = int(f.readline())&lt;br /&gt;
        if not validate_input(n):&lt;br /&gt;
            with open(&amp;quot;scobitoare.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
    return p, n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_output(output):&lt;br /&gt;
    with open(&amp;quot;scobitoare.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        g.write(&amp;quot;Date de intrare valide\n&amp;quot;)&lt;br /&gt;
        g.write(str(output))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    inputs = read_input()&lt;br /&gt;
    if inputs:&lt;br /&gt;
        p, n = inputs&lt;br /&gt;
        if p == 1:&lt;br /&gt;
            output = T(n)&lt;br /&gt;
        else:&lt;br /&gt;
            output = T(n) - T(n - 1)&lt;br /&gt;
        write_output(output)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod este scris în limbajul Python și conține următoarele funcții:&lt;br /&gt;
&lt;br /&gt;
1. Funcția &amp;quot;T(n)&amp;quot; calculează valoarea funcției T definită recursiv după cum urmează: T(1) = 1, T(2) = 3, T(3) = 7, T(4) = 11, T(n) = 2*T(n-1) + T(n-2) + T(n-3) - 1 pentru n &amp;gt; 4. În cazul în care n este o putere a lui 2, se aplică o formulă alternativă care folosește funcția &amp;quot;pow&amp;quot; din biblioteca Python &amp;quot;math&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
2. Funcția &amp;quot;validate_input(n)&amp;quot; returnează &amp;quot;True&amp;quot; dacă n se află între 1 și 1000 și &amp;quot;False&amp;quot; altfel.&lt;br /&gt;
&lt;br /&gt;
3. Funcția &amp;quot;read_input()&amp;quot; citește din fișierul &amp;quot;scobitoare.in&amp;quot; două numere întregi: &amp;quot;p&amp;quot; și &amp;quot;n&amp;quot;. Funcția verifică dacă n este valid folosind funcția &amp;quot;validate_input(n)&amp;quot;. În caz contrar, scrie în fișierul &amp;quot;scobitoare.out&amp;quot; mesajul &amp;quot;Date de intrare invalide&amp;quot; și se termină.&lt;br /&gt;
&lt;br /&gt;
4. Funcția &amp;quot;write_output(output)&amp;quot; scrie valoarea &amp;quot;output&amp;quot; în fișierul &amp;quot;scobitoare.out&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
5. În blocul &amp;quot;if __name__ == &#039;__main__&#039;:&amp;quot;, funcția &amp;quot;read_input()&amp;quot; este apelată pentru a citi inputul. Dacă inputul este valid, se calculează valoarea lui &amp;quot;output&amp;quot; folosind funcția &amp;quot;T(n)&amp;quot; și se apelează funcția &amp;quot;write_output(output)&amp;quot; pentru a scrie outputul în fișierul &amp;quot;scobitoare.out&amp;quot;. În cazul în care p este diferit de 1, se calculează diferența dintre T(n) și T(n-1).&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2924_-_FactorialInnEasy&amp;diff=5782</id>
		<title>2924 - FactorialInnEasy</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2924_-_FactorialInnEasy&amp;diff=5782"/>
		<updated>2023-05-03T05:50:29Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă numărul natural n. Să se afișeze numărul de cifre a lui (n!)&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;.&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;
După ce se afișează mesajul de validitate a datelor introduse corespunzător (&amp;quot;Date de intrare valide&amp;quot; în cazul în care datele respectă cerințele; &amp;quot;Input-ul trebuie să fie un număr întreg&amp;quot; pentru cazul în care n nu este număr întreg; &amp;quot;Input invalid: {eroare}&amp;quot; în orice alt caz), programul va afișa pe ecran numărul de cifre a lui (n!)&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; formatat într-un mesaj, astfel: Numărul de cifre din ({n}!)^{n} este {numărul de cifre}&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* n &amp;amp;les; 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceți un număr pozitiv: 3&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: Numărul de cifre din (3!)^3 este 3&lt;br /&gt;
==Explicație exemplu==&lt;br /&gt;
(3!)&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;=216&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(n: str) -&amp;gt; int:&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(n)&lt;br /&gt;
        if n &amp;lt; 1:&lt;br /&gt;
            raise ValueError(&amp;quot;Input-ul trebuie să fie un număr întreg&amp;quot;)&lt;br /&gt;
        return n&lt;br /&gt;
    except ValueError as e:&lt;br /&gt;
        print(f&amp;quot;Input invalid: {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def compute_factorial_power(n: int) -&amp;gt; int:&lt;br /&gt;
    factorial = 1&lt;br /&gt;
    for i in range(2, n+1):&lt;br /&gt;
        factorial *= i&lt;br /&gt;
    return factorial ** n&lt;br /&gt;
&lt;br /&gt;
def count_digits(number: int) -&amp;gt; int:&lt;br /&gt;
    return len(str(number))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = input(&amp;quot;Introduceți un număr pozitiv: &amp;quot;)&lt;br /&gt;
    n = validate_input(n)&lt;br /&gt;
    if n:&lt;br /&gt;
        factorial_power = compute_factorial_power(n)&lt;br /&gt;
        digit_count = count_digits(factorial_power)&lt;br /&gt;
        print(&amp;quot;Date de intrare valide&amp;quot;)&lt;br /&gt;
        print(f&amp;quot;Numărul de cifre din ({n}!)^{n} este {digit_count}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Funcția `validate_input(n: str) -&amp;gt; int` primește un string `n` și încearcă să îl transforme într-un număr întreg. Dacă acest lucru este posibil și numărul obținut este mai mare sau egal cu 1, atunci funcția returnează acel număr. În caz contrar, funcția aruncă o excepție și afișează un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
Funcția `compute_factorial_power(n: int) -&amp;gt; int` primește un număr întreg `n` și calculează valoarea expresiei `(n!)^n`, unde `n!` reprezintă factorialul lui `n`. Funcția utilizează un ciclu for pentru a calcula factorialul lui `n`, iar apoi ridică acest factorial la puterea `n`.&lt;br /&gt;
&lt;br /&gt;
Funcția `count_digits(number: int) -&amp;gt; int` primește un număr întreg `number` și returnează numărul de cifre ale acestuia. Funcția convertește numărul într-un string și returnează lungimea acestui string.&lt;br /&gt;
&lt;br /&gt;
În funcția `main`, se citește un număr pozitiv de la tastatură și se validează folosind funcția `validate_input`. Dacă numărul este valid, se calculează valoarea expresiei cerute utilizând funcția `compute_factorial_power`, iar apoi se numără cifrele acestei valori utilizând funcția `count_digits`. Rezultatul este afișat la ecran.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4044_-_camere&amp;diff=5781</id>
		<title>4044 - camere</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4044_-_camere&amp;diff=5781"/>
		<updated>2023-05-03T05:45:26Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Te afli într-o cameră de formă dreptunghiulară, privită sub forma unei matrici cu N linii și M coloane. Camera depozitează alune, nuci și castane, fiecare celulă din matrice fiind însemnată cu un caracter din mulțimea {&#039;A&#039;, &#039;N&#039;, &#039;C&#039;}. Caracterul &#039;A&#039; reprezintă o alună, &#039;N&#039; o nucă, iar &#039;C&#039; o castană. Dorești să imparți în mod cât mai egal cu sora ta gustările din cameră, iar cum castanele depozitate nu sunt comestibilie, tu ai dori să vezi câte submatrici cu laturile paralele cu cele ale camerei poți alege, astfel încât numărul de alune să fie egal cu numărul de nuci.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Prima linie din input conține numerele N și M. Pe următoarele N linii se vor găsi câte M caractere din mulțime {&#039;A&#039;, &#039;N&#039;, &#039;C&#039;}, reprezentând elementele matricii.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Se efectuează verificarea, care va afișa un mesaj corespunzător în funcție de input-ul dat și cerințele de validitate ale problemei. Dacă testele de validitate sunt efectuate cu succes, pe un rând nou se va afișa un singur număr, reprezentând valoarea cerută.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; N, M &amp;amp;les; 300&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 3 4&lt;br /&gt;
: ACNN&lt;br /&gt;
: NCCA&lt;br /&gt;
: AACN&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 18&lt;br /&gt;
==Explicație exemplu==&lt;br /&gt;
Printre submatricile numărate se află cele cu colțurile în punctele {(1, 1), (3, 4)}, {(3, 3), (3, 3)}, {(1, 1), (2, 1)}, etc.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from typing import List&lt;br /&gt;
&lt;br /&gt;
def validate_input(N: int, M: int, matrix: List[List[str]]) -&amp;gt; bool:&lt;br /&gt;
    # Verifică dacă N și M sunt în intervalul specificat&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 300) or not (1 &amp;lt;= M &amp;lt;= 300):&lt;br /&gt;
        return False&lt;br /&gt;
    # Verifică dacă matricea conține doar caracterele {&#039;A&#039;, &#039;N&#039;, &#039;C&#039;}&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(M):&lt;br /&gt;
            if matrix[i][j] not in {&#039;A&#039;, &#039;N&#039;, &#039;C&#039;}:&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def count_submatrices(N: int, M: int, matrix: List[List[str]]) -&amp;gt; int:&lt;br /&gt;
    count = 0&lt;br /&gt;
    # Iterează prin toate submatricile posibile ale matricei&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(M):&lt;br /&gt;
            for k in range(i, N):&lt;br /&gt;
                for l in range(j, M):&lt;br /&gt;
                    # Calculează numărul de alune și nuci în submatrice&lt;br /&gt;
                    num_almonds = sum(matrix[p][q] == &#039;A&#039; for p in range(i, k+1) for q in range(j, l+1))&lt;br /&gt;
                    num_walnuts = sum(matrix[p][q] == &#039;N&#039; for p in range(i, k+1) for q in range(j, l+1))&lt;br /&gt;
                    # Verifică dacă numărul de alune este egal cu numărul de nuci&lt;br /&gt;
                    if num_almonds == num_walnuts:&lt;br /&gt;
                        count += 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    N, M = map(int, input().split())&lt;br /&gt;
    matrix = [list(input().strip()) for _ in range(N)]&lt;br /&gt;
&lt;br /&gt;
    # Validarea datelor de intrare&lt;br /&gt;
    if not validate_input(N, M, matrix):&lt;br /&gt;
        print(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Date de intrare valide&amp;quot;)&lt;br /&gt;
    # Rezolvarea problemei și afișarea rezultatului&lt;br /&gt;
    result = count_submatrices(N, M, matrix)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Programul are trei funcții principale:&lt;br /&gt;
&lt;br /&gt;
1. `validate_input`: verifică dacă datele de intrare sunt valide. Verifică dacă N și M se încadrează în intervalul specificat și dacă matricea conține doar caracterele {&#039;A&#039;, &#039;N&#039;, &#039;C&#039;}.&lt;br /&gt;
&lt;br /&gt;
2. `count_submatrices`: calculează numărul de submatrici ale matricei pentru care numărul de caractere &#039;A&#039; este egal cu numărul de caractere &#039;N&#039;. Iterează prin toate submatricile posibile ale matricei și verifică condiția.&lt;br /&gt;
&lt;br /&gt;
3. `main`: citește datele de intrare, validează datele, rezolvă problema și afișează rezultatul.&lt;br /&gt;
&lt;br /&gt;
Programul citește N și M de la intrarea standard, apoi citește matricea de dimensiune N x M. Apoi, datele de intrare sunt validate folosind funcția `validate_input`. Dacă datele de intrare sunt valide, programul calculează numărul de submatrici ale matricei pentru care numărul de caractere &#039;A&#039; este egal cu numărul de caractere &#039;N&#039;, folosind funcția `count_submatrices`. Rezultatul este afișat la ieșirea standard.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2826_-_Duplicare1&amp;diff=5780</id>
		<title>2826 - Duplicare1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2826_-_Duplicare1&amp;diff=5780"/>
		<updated>2023-05-03T05:42:45Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Subprogramul duplicare are doi parametri, în această ordine:&lt;br /&gt;
&lt;br /&gt;
* n, prin care primește un număr natural (n∈[1,104]);&lt;br /&gt;
* d, prin care furnizează numărul obţinut prin duplicarea fiecărei cifre pare a lui n sau -1 dacă acesta nu are nicio cifră pară.&lt;br /&gt;
Scrieți definiția completă a subprogramului în Python.&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;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Date de intrare valide&amp;quot;, apoi pe un rând nou numărul cerut cu cifrele pare duplicate. În cazul în care numărul introdus nu corespunde restricțiilor date, se va afișa &amp;quot;Date de intrare invalide&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 2380&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: 2238800&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;gt;&lt;br /&gt;
def validate_input(n: int, d: int) -&amp;gt; bool:&lt;br /&gt;
    # Verificăm dacă n este între 1 și 10^4&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 10 ** 4:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă d este între -1 și 10^9&lt;br /&gt;
    if d &amp;lt; -1 or d &amp;gt; 10 ** 9:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def duplicare(n: int, d: int) -&amp;gt; int:&lt;br /&gt;
    # Initializăm numărul rezultat cu 0&lt;br /&gt;
    result = 0&lt;br /&gt;
&lt;br /&gt;
    # Parcurgem cifrele numărului n&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        # Extragerea ultimei cifre din n&lt;br /&gt;
        cifra = n % 10&lt;br /&gt;
&lt;br /&gt;
        # Dacă cifra este pară, o adăugăm de două ori în numărul rezultat&lt;br /&gt;
        if cifra % 2 == 0:&lt;br /&gt;
            result = result * 100 + cifra * 10 + cifra&lt;br /&gt;
        else:&lt;br /&gt;
            result = result * 10 + cifra&lt;br /&gt;
&lt;br /&gt;
        # Trecem la următoarea cifră&lt;br /&gt;
        n //= 10&lt;br /&gt;
&lt;br /&gt;
    # Dacă nu am adăugat nicio cifră pară, returnăm -1&lt;br /&gt;
    if result == 0:&lt;br /&gt;
        return -1&lt;br /&gt;
    else:&lt;br /&gt;
        return result&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citim numarul n de la tastatura&lt;br /&gt;
    n = int(input(&amp;quot;Introduceti numarul n: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    # Apelam subprogramul duplicare si afisam rezultatul&lt;br /&gt;
    d = duplicare(n)&lt;br /&gt;
    if not validate_input(n, d):&lt;br /&gt;
        print(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Date de intrare valide&amp;quot;)&lt;br /&gt;
    if d == -1:&lt;br /&gt;
        print(&amp;quot;Numarul n nu are cifre pare&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(f&amp;quot;Numarul obtinut prin duplicarea cifrelor pare din {n} este: {d}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest program are două funcții și un bloc de cod principal:&lt;br /&gt;
&lt;br /&gt;
1. Funcția `validate_input` primește doi parametri: `n` și `d`, ambele de tip int. Funcția verifică dacă `n` se află între 1 și 10^4 și dacă `d` se află între -1 și 10^9. Dacă ambele condiții sunt adevărate, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
2. Funcția `duplicare` primește doi parametri: `n` și `d`, ambele de tip int. Funcția parcurge cifrele numărului `n` și, pentru fiecare cifră pară, o adaugă de două ori la `result`. Dacă `n` nu are cifre pare, funcția returnează -1. Altfel, funcția returnează numărul obținut prin duplicarea cifrelor pare.&lt;br /&gt;
&lt;br /&gt;
3. Blocul principal citește un număr întreg `n` de la tastatură, apelează funcția `duplicare` și afișează rezultatul. Dacă datele de intrare sunt invalide (potrivit funcției `validate_input`), se afișează un mesaj de eroare. Dacă `duplicare` returnează -1, se afișează un mesaj care indică că `n` nu are cifre pare, iar în caz contrar se afișează numărul obținut prin duplicarea cifrelor pare.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3489_-_Numara_punctele&amp;diff=5779</id>
		<title>3489 - Numara punctele</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3489_-_Numara_punctele&amp;diff=5779"/>
		<updated>2023-05-03T04:52:06Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Considerăm o suprață plană în formă de pătrat având latura de 100 de unități și două mulțimi:&lt;br /&gt;
* Mulțimea P de puncte având coordonatele numere reale pozitive mai mici decat 100 (deci aparținând pătratului).&lt;br /&gt;
* Mulțimea ordonată C de cercuri având centrul în același pătrat și cu raza variabilă (se poate întâmpla ca centrul să fie în punctul p(1,1) și cercul să aibă raza de 3, deci să aibă o porțiune înafara pătratului).&lt;br /&gt;
&lt;br /&gt;
Se dorește să se stabilească, pentru fiecare dintre cercurile din mulțimea C, câte puncte din mulțimea P se află în interior (sau pe marginea acestuia).&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numărul n de puncte, iar apoi n cupluri de numere reale, separate prin spații reprezentând coordonatele fiecărui punct. După ce a citit valorile reprezentând coordonatele punctelor, se va citi numărul m de cercuri și vor apoi cele m triplete reprezentând coordonatele centrului cercului respectiv raza cercului.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
În cazul în care datele sunt valide, se va afișa un mesaj de confirmare, iar pentru fiecare cerc citit se va afișa pe câte o linie diferită câte puncte sunt in interiorul său sau pe frontieră. În caz contrar, se va afișa un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1≤n≤100000&lt;br /&gt;
* Pentru fiecare punct p(x,y) avem x∈[0,100] respectiv y∈[0,100]&lt;br /&gt;
* 1≤m≤10000&lt;br /&gt;
* Pentru fiecare cerc c(x,y,r) avem x∈[0,100], y∈[0,100] și r∈[0,30]&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 3&lt;br /&gt;
: 6.39 24.96&lt;br /&gt;
: 6.23 6.17&lt;br /&gt;
: 20.0 20.0&lt;br /&gt;
: 3&lt;br /&gt;
: 23.05 83 10.57&lt;br /&gt;
: 15.00 15.00 10.0&lt;br /&gt;
: 10.0 20.0 10&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt corecte.&lt;br /&gt;
: 0&lt;br /&gt;
: 1&lt;br /&gt;
: 2&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validare(n: int, puncte: list[tuple[float, float]], m: int, cercuri: list[tuple[float, float, float]]) -&amp;gt; bool:&lt;br /&gt;
    # verificam numarul de puncte si de cercuri&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 100000 or not 1 &amp;lt;= m &amp;lt;= 10000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # verificam coordonatele punctelor si ale cercurilor&lt;br /&gt;
    for p in puncte:&lt;br /&gt;
        if not 0 &amp;lt;= p[0] &amp;lt;= 100 or not 0 &amp;lt;= p[1] &amp;lt;= 100:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    for c in cercuri:&lt;br /&gt;
        if not 0 &amp;lt;= c[0] &amp;lt;= 100 or not 0 &amp;lt;= c[1] &amp;lt;= 100 or c[2] &amp;lt;= 0:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_puncte_in_cercuri(puncte, cercuri):&lt;br /&gt;
    numar_puncte = []&lt;br /&gt;
    for cerc in cercuri:&lt;br /&gt;
        num_puncte_in_cerc = 0&lt;br /&gt;
        for punct in puncte:&lt;br /&gt;
            distanta = ((punct[0] - cerc[0]) ** 2 + (punct[1] - cerc[1]) ** 2) ** 0.5&lt;br /&gt;
            if distanta &amp;lt;= cerc[2]:&lt;br /&gt;
                num_puncte_in_cerc += 1&lt;br /&gt;
        numar_puncte.append(num_puncte_in_cerc)&lt;br /&gt;
    return numar_puncte&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # citirea numarului de puncte&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    # citirea coordonatelor fiecarui punct&lt;br /&gt;
    puncte = []&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        x, y = input().split()&lt;br /&gt;
        x = float(x)&lt;br /&gt;
        y = float(y)&lt;br /&gt;
        puncte.append((x, y))&lt;br /&gt;
    # citirea numarului de cercuri&lt;br /&gt;
    m = int(input())&lt;br /&gt;
    # citirea coordonatelor si razei fiecarui cerc&lt;br /&gt;
    cercuri = []&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        x, y, r = input().split()&lt;br /&gt;
        x = float(x)&lt;br /&gt;
        y = float(y)&lt;br /&gt;
        r = float(r)&lt;br /&gt;
        cercuri.append((x, y, r))&lt;br /&gt;
    # validarea datelor introduse&lt;br /&gt;
    if validare(n, puncte, m, cercuri):&lt;br /&gt;
        print(&amp;quot;Datele introduse sunt corecte.&amp;quot;)&lt;br /&gt;
        # numarul de puncte din interiorul fiecarui cerc&lt;br /&gt;
        numar_puncte = numar_puncte_in_cercuri(puncte, cercuri)&lt;br /&gt;
        # afisarea numarului de puncte din interiorul fiecarui cerc&lt;br /&gt;
        for i in numar_puncte:&lt;br /&gt;
            print(i)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Unul sau mai multe numere introduse nu sunt valide.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest cod are două funcții definite și o secțiune principală de cod. &lt;br /&gt;
&lt;br /&gt;
Funcția `validare` primește ca argumente un număr întreg `n`, o listă de perechi de coordonate (x,y) reprezentând punctele și un număr întreg `m` și o listă de tupluri (x,y,r) reprezentând cercurile. Funcția verifică dacă numărul de puncte și cercuri este în limitele permise și dacă coordonatele și razele cercurilor sunt valide (în intervalul 0-100). În cazul în care aceste condiții nu sunt îndeplinite, funcția returnează `False`, altfel returnează `True`.&lt;br /&gt;
&lt;br /&gt;
Funcția `numar_puncte_in_cercuri` primește ca argumente lista de puncte și cea de cercuri și returnează o listă cu numărul de puncte din fiecare cerc.&lt;br /&gt;
&lt;br /&gt;
În secțiunea principală de cod, mai întâi se citește numărul de puncte, apoi coordonatele fiecărui punct, apoi numărul de cercuri și coordonatele și razele acestora. După aceea se validează datele introduse. În cazul în care sunt valide, se afișează mesajul &amp;quot;Datele introduse sunt corecte.&amp;quot; și se calculează numărul de puncte din fiecare cerc cu ajutorul funcției `numar_puncte_in_cercuri`, iar apoi se afișează numărul de puncte din fiecare cerc. În caz contrar, se afișează mesajul &amp;quot;Unul sau mai multe numere introduse nu sunt valide.&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0023_-_Oglindit1&amp;diff=5778</id>
		<title>0023 - Oglindit1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0023_-_Oglindit1&amp;diff=5778"/>
		<updated>2023-05-03T04:15:30Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o funcție Python care să determine oglinditul unui număr natural transmis ca parametru. Funcția va întoarce rezultatul prin intermediul unui parametru de ieşire.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
* numele funcției va fi oglindit&lt;br /&gt;
* funcția va avea doi parametri: primul parametru reprezintă numărul pentru care se calculează oglinditul, iar la doilea parametru reprezintă valoarea calculată&lt;br /&gt;
* numărul pentru care se calculează oglinditul va fi mai mic decât 1.000.000.000&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;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt valide.&amp;quot;, apoi pe un rând nou oglinditul numărului introdus. În cazul în care numărul introdus depășește limitele date, se va afișa &amp;quot;n trebuie să fie un număr natural mai mic decât 1.000.000.000&amp;quot;, iar dacă numărul introdus nu este întreg, se va afișa &amp;quot;n trebuie să fie de tip întreg&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceți un număr natural mai mic decât 1.000.000.000: 12345&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt valide.&lt;br /&gt;
: Oglinditul numărului 12345 este 54321.&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def oglindit(n, ogl=None):&lt;br /&gt;
    if ogl is None:&lt;br /&gt;
        ogl = 0&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        ogl = ogl * 10 + n % 10&lt;br /&gt;
        n = n // 10&lt;br /&gt;
    return ogl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validare_oglindit(n):&lt;br /&gt;
    if not isinstance(n, int):&lt;br /&gt;
        raise TypeError(&amp;quot;n trebuie să fie de tip întreg&amp;quot;)&lt;br /&gt;
    if n &amp;lt;= 0 or n &amp;gt;= 1000000000:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie să fie un număr natural mai mic decât 1.000.000.000&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = int(input(&amp;quot;Introduceți un număr natural mai mic decât 1.000.000.000: &amp;quot;))&lt;br /&gt;
    validare_oglindit(n)&lt;br /&gt;
    print(&amp;quot;Datele introduse sunt valide.&amp;quot;)&lt;br /&gt;
    ogl = 0&lt;br /&gt;
    ogl = oglindit(n, ogl)&lt;br /&gt;
    print(f&amp;quot;Oglinditul numărului {n} este {ogl}.&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Funcția oglindit(n, ogl=None) primește un număr natural n și returnează oglinditul acestuia. Oglinditul unui număr este numărul obținut prin scrierea cifrelor numărului dat în ordine inversă. Această funcție realizează acest lucru prin utilizarea unui loop while care extrage fiecare cifră a numărului dat prin împărțirea acestuia cu 10 și adăugarea cifrei obținute la oglindă (ogl) prin înmulțire cu 10 și adunare cu cifra. După extragerea fiecărei cifre, numărul inițial este împărțit la 10 prin îndepărtarea cifrei extrase. Când toate cifrele au fost extrase, funcția returnează oglinda numărului.&lt;br /&gt;
&lt;br /&gt;
Funcția validare_oglindit(n) primește un număr natural n și verifică dacă acesta este un număr întreg și dacă este mai mic decât 1.000.000.000. Dacă aceste condiții nu sunt îndeplinite, funcția va genera o eroare de tipul TypeError sau ValueError.&lt;br /&gt;
&lt;br /&gt;
În secțiunea if __name__ == &amp;quot;__main__&amp;quot;: a codului, utilizatorul este întâmpinat cu un mesaj prin intermediul funcției input() și numărul introdus de utilizator este stocat în variabila n. Apoi, funcția validare_oglindit(n) este apelată pentru a verifica dacă numărul dat este valid. Dacă acesta este valid, se afișează un mesaj care confirmă validitatea datelor, iar funcția oglindit(n, ogl) este apelată pentru a calcula oglinditul numărului introdus de utilizator. Rezultatul este afișat cu ajutorul funcției print().&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0032_-_EliminareCifre&amp;diff=5777</id>
		<title>0032 - EliminareCifre</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0032_-_EliminareCifre&amp;diff=5777"/>
		<updated>2023-05-03T04:03:39Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie definiția completă a funcției Python P care primește prin intermediul parametrului n un număr natural cu cel mult 9 cifre, iar prin intermediul parametrului c o cifră. Funcția întoarce tot prin intermediul parametrului n numărul obținut prin eliminarea tuturor aparițiilor cifrei c.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
* numele funcției va fi P&lt;br /&gt;
* funcția va avea doi parametri: primul parametru este n, iar al doilea este c&lt;br /&gt;
* dacă după eliminare numărul obținut nu mai conține nici o cifră sau conține doar cifre 0, rezultatul va fi 0&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură numerele n și c.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele introduse sunt valide.&amp;quot;, apoi pe un rând nou numărul n fără cifrele c. În cazul în care n sau c depășesc limitele date ori nu sunt numere întregi, se va afișa un mesaj corespunzător în funcție de eroarea generată.&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: Introduceți un număr natural cu cel mult 9 cifre: 2524722&lt;br /&gt;
: Introduceți o cifră între 0 și 9: 5&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Datele introduse sunt valide.&lt;br /&gt;
: Numărul obținut prin eliminarea cifrei 5 din 2524722 este: 224722&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validare_P(n, c):&lt;br /&gt;
    if not isinstance(n, int) or n &amp;lt; 0:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie să fie un număr natural&amp;quot;)&lt;br /&gt;
    if not isinstance(c, int) or not 0 &amp;lt;= c &amp;lt;= 9:&lt;br /&gt;
        raise ValueError(&amp;quot;c trebuie să fie o cifră între 0 și 9&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def P(n, c):&lt;br /&gt;
    validare_P(n, c)&lt;br /&gt;
    n_str = str(n)&lt;br /&gt;
    n_fara_c = &amp;quot;&amp;quot;.join([cifra for cifra in n_str if cifra != str(c)])&lt;br /&gt;
    if len(n_fara_c) == 0 or all(cifra == &amp;quot;0&amp;quot; for cifra in n_fara_c):&lt;br /&gt;
        return 0&lt;br /&gt;
    return int(n_fara_c)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(input(&amp;quot;Introduceți un număr natural cu cel mult 9 cifre: &amp;quot;))&lt;br /&gt;
        c = int(input(&amp;quot;Introduceți o cifră între 0 și 9: &amp;quot;))&lt;br /&gt;
        validare_P(n, c)&lt;br /&gt;
        print(&amp;quot;Datele introduse sunt valide.&amp;quot;)&lt;br /&gt;
        rezultat = P(n, c)&lt;br /&gt;
        print(f&amp;quot;Numărul obținut prin eliminarea cifrei {c} din {n} este: {rezultat}&amp;quot;)&lt;br /&gt;
    except Exception as ex:&lt;br /&gt;
        print(f&amp;quot;O eroare a survenit: {ex}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Funcția `validare_P(n, c)` este utilizată pentru a verifica dacă argumentele primite de funcția `P(n, c)` respectă anumite condiții. Aceasta verifică dacă `n` este un număr natural (întreg pozitiv) și dacă `c` este o cifră între 0 și 9. Dacă oricare dintre aceste condiții nu este îndeplinită, se va arunca o excepție de tip `ValueError` cu un mesaj corespunzător.&lt;br /&gt;
&lt;br /&gt;
Funcția `P(n, c)` primește două argumente: `n`, un număr natural cu cel mult 9 cifre și `c`, o cifră între 0 și 9. Aceasta mai întâi verifică dacă argumentele primite sunt valide, folosind funcția `validare_P(n, c)`. Apoi, convertește numărul `n` la un șir de caractere și elimină toate aparițiile cifrei `c` din șirul obținut, folosind o listă de comprimare și funcția `join()`. Dacă șirul obținut are lungimea 0 sau conține doar cifra 0, se va returna 0. În caz contrar, se va returna numărul format din șirul obținut, folosind funcția `int()`.&lt;br /&gt;
&lt;br /&gt;
În blocul `if __name__ == &amp;quot;__main__&amp;quot;:` se citește numărul `n` și cifra `c` de la tastatură. Se verifică apoi dacă acestea sunt valide, folosind funcția `validare_P(n, c)`. Dacă acestea sunt valide, se afișează un mesaj de confirmare și se calculează rezultatul apelând funcția `P(n, c)`. În caz contrar, se va afișa mesajul de eroare corespunzător.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0894_-_CifMinMax&amp;diff=5776</id>
		<title>0894 - CifMinMax</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0894_-_CifMinMax&amp;diff=5776"/>
		<updated>2023-05-03T03:56:11Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o funcție Python care să determine cea mai mare și cea mai mică cifră a unui număr natural transmis ca parametru. Funcția va întoarce rezultatele prin intermediul unor parametri de ieşire.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
* numele funcției va fi cifminmax&lt;br /&gt;
* funcția va avea trei parametri: primul parametru reprezintă numărul pentru care se calculează valorile cerute;al doilea parametru va reprezenta cifra maximă, iar al treilea va reprezenta cifra minimă&lt;br /&gt;
* numărul pentru care se calculează cele doua valori va fi mai mic decât 2.000.000.000&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;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Date de intrare valide.&amp;quot;, apoi pe un rând nou cea mai mare și cea mai mică cifră din numărul introdus. În cazul în care numărul introdus depășește limitele date, se va afișa &amp;quot;Date de intrare invalide.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; Intrare&lt;br /&gt;
: 12345&lt;br /&gt;
; Ieșire&lt;br /&gt;
: Date de intrare valide&lt;br /&gt;
: Cea mai mare cifra este: 5&lt;br /&gt;
: Cea mai mica cifra este: 1&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_cifminmax(n, max_cif, min_cif):&lt;br /&gt;
    if n &amp;gt;= 2000000000:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def cifminmax(n, max_cif, min_cif):&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        cif = n % 10&lt;br /&gt;
        if cif &amp;gt; max_cif:&lt;br /&gt;
            max_cif = cif&lt;br /&gt;
        if cif &amp;lt; min_cif:&lt;br /&gt;
            min_cif = cif&lt;br /&gt;
        n //= 10&lt;br /&gt;
    return max_cif, min_cif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    n = 123456789&lt;br /&gt;
    max_cif = -1&lt;br /&gt;
    min_cif = 10&lt;br /&gt;
&lt;br /&gt;
    if validate_cifminmax(n, max_cif, min_cif):&lt;br /&gt;
        print(&amp;quot;Date de intrare valide&amp;quot;)&lt;br /&gt;
        max_cif, min_cif = cifminmax(n, max_cif, min_cif)&lt;br /&gt;
        print(&amp;quot;Cea mai mare cifra este:&amp;quot;, max_cif)&lt;br /&gt;
        print(&amp;quot;Cea mai mica cifra este:&amp;quot;, min_cif)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație==&lt;br /&gt;
Acest cod definește trei funcții și verifică dacă datele de intrare sunt valide pentru a calcula cea mai mare și cea mai mică cifră a unui număr dat.&lt;br /&gt;
&lt;br /&gt;
Funcția `validate_cifminmax` primește trei argumente: `n`, `max_cif`, și `min_cif`. Funcția verifică dacă valoarea `n` este mai mică decât 2000000000 și returnează `True` dacă da, `False` în caz contrar. Această funcție este folosită pentru a verifica dacă numărul dat este un număr valid, adică dacă acesta este mai mic decât 2 miliarde.&lt;br /&gt;
&lt;br /&gt;
Funcția `cifminmax` primește trei argumente: `n`, `max_cif`, și `min_cif`. Această funcție calculează cea mai mare și cea mai mică cifră a lui `n`. Se începe prin a atribui `max_cif` o valoare inițială de -1 și `min_cif` o valoare inițială de 10. Apoi, folosind un ciclu `while`, se extrage fiecare cifră a lui `n` prin împărțirea lui `n` la 10 și reținerea restului. Dacă cifra extrasă este mai mare decât valoarea curentă a lui `max_cif`, aceasta devine noua valoare a lui `max_cif`. Dacă cifra extrasă este mai mică decât valoarea curentă a lui `min_cif`, aceasta devine noua valoare a lui `min_cif`. La sfârșitul ciclului, funcția returnează cele două valori `max_cif` și `min_cif`.&lt;br /&gt;
&lt;br /&gt;
În `main` se inițializează variabilele `n`, `max_cif` și `min_cif`. Apoi, se verifică dacă datele de intrare sunt valide apelând funcția `validate_cifminmax`. Dacă datele sunt valide, se afișează un mesaj corespunzător, se calculează cea mai mare și cea mai mică cifră a lui `n` folosind funcția `cifminmax`, și se afișează rezultatele. Dacă datele de intrare nu sunt valide, se afișează un alt mesaj.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0894_-_CifMinMax&amp;diff=5775</id>
		<title>0894 - CifMinMax</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0894_-_CifMinMax&amp;diff=5775"/>
		<updated>2023-05-03T03:52:03Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerinţa==&lt;br /&gt;
Să se scrie o funcție Python care să determine cea mai mare și cea mai mică cifră a unui număr natural transmis ca parametru. Funcția va întoarce rezultatele prin intermediul unor parametri de ieşire.&lt;br /&gt;
&lt;br /&gt;
==Restricţii şi precizări==&lt;br /&gt;
* numele funcției va fi cifminmax&lt;br /&gt;
* funcția va avea trei parametri: primul parametru reprezintă numărul pentru care se calculează valorile cerute;al doilea parametru va reprezenta cifra maximă, iar al treilea va reprezenta cifra minimă&lt;br /&gt;
* numărul pentru care se calculează cele doua valori va fi mai mic decât 2.000.000.000&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;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Date de intrare valide.&amp;quot;, apoi pe un rând nou cea mai mare . În cazul în care numărul introdus depășește limitele date, se va afișa &amp;quot;Numarul introdus nu este valid.&amp;quot;, iar dacă numărul introdus nu este întreg, se va afișa &amp;quot;Nu ati introdus un numar intreg.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_cifminmax(n, max_cif, min_cif):&lt;br /&gt;
    if n &amp;gt;= 2000000000:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def cifminmax(n, max_cif, min_cif):&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        cif = n % 10&lt;br /&gt;
        if cif &amp;gt; max_cif:&lt;br /&gt;
            max_cif = cif&lt;br /&gt;
        if cif &amp;lt; min_cif:&lt;br /&gt;
            min_cif = cif&lt;br /&gt;
        n //= 10&lt;br /&gt;
    return max_cif, min_cif&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = 123456789&lt;br /&gt;
    max_cif = -1&lt;br /&gt;
    min_cif = 10&lt;br /&gt;
&lt;br /&gt;
    if validate_cifminmax(n, max_cif, min_cif):&lt;br /&gt;
        max_cif, min_cif = cifminmax(n, max_cif, min_cif)&lt;br /&gt;
        print(&amp;quot;Cea mai mare cifra este:&amp;quot;, max_cif)&lt;br /&gt;
        print(&amp;quot;Cea mai mica cifra este:&amp;quot;, min_cif)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Date de intrare invalide&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1675_-_Calc&amp;diff=5191</id>
		<title>1675 - Calc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1675_-_Calc&amp;diff=5191"/>
		<updated>2023-04-28T08:04:16Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La un concurs de informatică participă 2∙N elevi împărțiți în N echipe de câte 2. Echipa poate lucra în comun la problemele propuse doar dacă au calculatoarele în rețea. Laboratorul de informatică este unul special: are 2∙N calculatoare, distribuite pe două rânduri la distanță de un metru între ele (vertical și orizontal) și N cabluri de rețea de lungime un metru. Concursul se desfășoară pe mai multe zile și nu există două zile de concurs cu aceeași configurație a rețelei.&lt;br /&gt;
&lt;br /&gt;
Exemplu: pentru N=3, cei 6 elevi au fost împărțiți în 3 echipe, iar aranjarea rețelei în cele 3 zile de concurs este cea din figura de mai jos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Administratorul laboratorului vrea să memoreze în ordine lexicografică toate configurațiile folosite în zilele de concurs. Cablul orizontal se notează prin 0, iar cel vertical prin 1. Lucrând ordonat și eficient, pentru cele trei zile el își va nota valorile: 001, 100, respectiv 111. Se observă că o reprezentare de genul 000, 010, 011, 101 nu poate fi realizată.&lt;br /&gt;
&lt;br /&gt;
==Cerința==&lt;br /&gt;
Cunoscând N, să se determine:&lt;br /&gt;
&lt;br /&gt;
Numărul de zile modulo 1000000007 în care se desfășoară concursul.&lt;br /&gt;
Configurațiile laboratorului în ziua X-1 și ziua X+1, cunoscând configurația zilei X.&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fişierul de intrare calc.in conţine pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2.&lt;br /&gt;
&lt;br /&gt;
Pe linia a doua vom avea numărul natural N.&lt;br /&gt;
&lt;br /&gt;
Pe linia a treia se va găsi un șir de N cifre binare, fără spații între ele, reprezentând configurația corectă realizată de administrator în ziua X.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Dacă valoarea lui p este 1, se va rezolva numai punctul 1) din cerință.&lt;br /&gt;
În acest caz, în fişierul de ieşire calc.out se va scrie un singur număr natural Z reprezentând numărul de zile în care se desfășoară concursul pentru cele N echipe.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui p este 2, se va rezolva numai punctul 2) din cerință.&lt;br /&gt;
În acest caz, fişierul de ieşire calc.out va conține două linii. Pe prima linie se vor scrie N cifre binare, fără spații între ele, reprezentând configurația rețelei din ziua precedentă, iar pe a doua linie N cifre binare, fără spații între ele, reprezentând configurația din ziua următoare. Dacă în ziua precedentă nu există o configurație conform cerințelor problemei, se va scrie pe prima linie valoarea -1. Dacă în ziua următoare nu există o configurație conform cerințelor problemei, se va scrie pe a doua linie valoarea -1.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; N &amp;amp;les; 100000&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, iar pentru cerința a doua se acordă 80 de puncte.&lt;br /&gt;
==Exemplul 1==&lt;br /&gt;
; calc.in&lt;br /&gt;
&lt;br /&gt;
: 1&lt;br /&gt;
: 3&lt;br /&gt;
: 001&lt;br /&gt;
; calc.out&lt;br /&gt;
&lt;br /&gt;
: 3&lt;br /&gt;
; Consola&lt;br /&gt;
: Input valid&lt;br /&gt;
==Exemplul 2==&lt;br /&gt;
; calc.in&lt;br /&gt;
&lt;br /&gt;
: 2&lt;br /&gt;
: 3&lt;br /&gt;
: 001&lt;br /&gt;
; calc.out&lt;br /&gt;
&lt;br /&gt;
: -1&lt;br /&gt;
: 100&lt;br /&gt;
; Consola&lt;br /&gt;
: Input valid&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
MODULO = 1000 * 1000 * 1000 + 7&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_input():&lt;br /&gt;
    with open(&amp;quot;calc.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        tip = int(f.readline().strip())&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        s = f.readline().strip()&lt;br /&gt;
    return tip, n, s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_output(prev, next):&lt;br /&gt;
    with open(&amp;quot;calc.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(f&amp;quot;{prev}\n{next}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_prev(s):&lt;br /&gt;
    n = len(s)&lt;br /&gt;
    prev = list(s)&lt;br /&gt;
    if s[n - 1] == &amp;quot;1&amp;quot; and s[n - 2] == &amp;quot;1&amp;quot;:&lt;br /&gt;
        prev[n - 1] = prev[n - 2] = &amp;quot;0&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        i = n - 2&lt;br /&gt;
        while i &amp;gt;= 0 and s[i] == &amp;quot;0&amp;quot;:&lt;br /&gt;
            i -= 1&lt;br /&gt;
        if i &amp;lt; 0:&lt;br /&gt;
            prev = &amp;quot;-1&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            prev[i] = &amp;quot;0&amp;quot;&lt;br /&gt;
            for j in range(i + 2, n):&lt;br /&gt;
                prev[j] = &amp;quot;1&amp;quot;&lt;br /&gt;
    return &amp;quot;&amp;quot;.join(prev)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_next(s):&lt;br /&gt;
    n = len(s)&lt;br /&gt;
    next = list(s)&lt;br /&gt;
    if s[n - 1] == &amp;quot;0&amp;quot; and s[n - 2] == &amp;quot;0&amp;quot;:&lt;br /&gt;
        next[n - 1] = next[n - 2] = &amp;quot;1&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        i = n - 1&lt;br /&gt;
        while i &amp;gt;= 0 and s[i] == &amp;quot;1&amp;quot;:&lt;br /&gt;
            i -= 1&lt;br /&gt;
        if i &amp;lt; 0:&lt;br /&gt;
            next = &amp;quot;-1&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            next[i - 1] = &amp;quot;1&amp;quot;&lt;br /&gt;
            next[i] = &amp;quot;0&amp;quot;&lt;br /&gt;
            oldi = i&lt;br /&gt;
            for j in range(i + 1, n):&lt;br /&gt;
                next[j] = &amp;quot;0&amp;quot;&lt;br /&gt;
            if (n - 1 - oldi) % 2 == 0:&lt;br /&gt;
                next[n - 1] = &amp;quot;1&amp;quot;&lt;br /&gt;
    return &amp;quot;&amp;quot;.join(next)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_fibonacci(n):&lt;br /&gt;
    if n &amp;lt;= 1:&lt;br /&gt;
        return 1&lt;br /&gt;
    a, b = 1, 1&lt;br /&gt;
    for i in range(2, n + 1):&lt;br /&gt;
        c = (a + b) % MODULO&lt;br /&gt;
        a, b = b, c&lt;br /&gt;
    return b&lt;br /&gt;
&lt;br /&gt;
def validate_input(tip: int, N: int, S: str) -&amp;gt; bool:&lt;br /&gt;
    if tip not in (1, 2):&lt;br /&gt;
        print(&amp;quot;tip trebuie sa fie 1 sau 2&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000):&lt;br /&gt;
        print(&amp;quot;N trebuie sa fie intre 1 si 100000&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if len(S) != N or not set(S).issubset({&#039;0&#039;, &#039;1&#039;}):&lt;br /&gt;
        print(&amp;quot;S trebuie sa fie un sir de N caractere &#039;0&#039; sau &#039;1&#039;&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    print(&amp;quot;Input valid&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    tip, n, s = read_input()&lt;br /&gt;
    if not validate_input(tip, n, s):&lt;br /&gt;
        exit(1)&lt;br /&gt;
    if tip == 1:&lt;br /&gt;
        result = compute_fibonacci(n)&lt;br /&gt;
        write_output(result, result)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if n == 1:&lt;br /&gt;
        write_output(&amp;quot;-1&amp;quot;, &amp;quot;-1&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    prev = compute_prev(s)&lt;br /&gt;
    next = compute_next(s)&lt;br /&gt;
    write_output(prev, next)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Programul citește datele de intrare din fișierul &amp;quot;calc.in&amp;quot;, validează datele de intrare, apoi își dă seama dacă tipul problemei este 1 sau 2.&lt;br /&gt;
&lt;br /&gt;
Dacă tipul problemei este 1, programul calculează numărul Fibonacci de ordine n și scrie rezultatul în fișierul &amp;quot;calc.out&amp;quot;. Dacă tipul problemei este 2, programul calculează valorile anterioară și următoare a unui șir de biți și scrie cele două rezultate în fișierul &amp;quot;calc.out&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pentru a calcula valorile anterioară și următoare, programul apelează funcțiile &amp;quot;compute_prev(s)&amp;quot; și &amp;quot;compute_next(s)&amp;quot; care primesc ca parametru un șir de biți și întorc valoarea anterioară și următoarea valoare, respectiv.&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica dacă datele de intrare sunt valide, programul utilizează funcția &amp;quot;validate_input(tip: int, N: int, S: str) -&amp;gt; bool&amp;quot;. Dacă datele de intrare nu sunt valide, programul afișează un mesaj de eroare și se termină.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1124_-_Patrate&amp;diff=5190</id>
		<title>1124 - Patrate</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1124_-_Patrate&amp;diff=5190"/>
		<updated>2023-04-28T08:02:09Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Dându-se n, un număr natural, să se afle numărul de pătrate care au colţurile coordonate numere întregi cuprinse între 0 şi n inclusiv.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Programul citește de la tastatură un număr natural n.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Programul va afişa pe ecran un număr natural, reprezentând numărul de pătrate formate cu cele (n+1)2 puncte. Deoarece rezultatul poate fi mare, se va afişa răspunsul modulo 666013. De asemenea, se afișează un mesaj de validare a datelor introduse.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 2.000.000.000&lt;br /&gt;
* Pentru teste în valoare de 30 de puncte, n ≤ 10&lt;br /&gt;
* Pentru teste în valoare de 75 de puncte, n ≤ 2.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;
: Valid input&lt;br /&gt;
: 6&lt;br /&gt;
==Explicație==&lt;br /&gt;
Pătratele ce se formează au colţurile:&lt;br /&gt;
&lt;br /&gt;
# (0, 0), (0, 1), (1, 1), (1, 0)&lt;br /&gt;
# (0, 1), (0, 2), (1, 2), (1, 1)&lt;br /&gt;
# (1, 0), (1, 1), (2, 1), (2, 0)&lt;br /&gt;
# (1, 1), (1, 2), (2, 2), (2, 1)&lt;br /&gt;
# (0, 0), (0, 2), (2, 2), (2, 0)&lt;br /&gt;
# (0, 1), (1, 2), (2, 1), (1, 0)&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def validate_input(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 2000000000:&lt;br /&gt;
        raise ValueError(&amp;quot;n trebuie sa fie intre 1 si 2.000.000.000&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Valid input&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_sum(n):&lt;br /&gt;
    validate_input(n)&lt;br /&gt;
    sol = 0&lt;br /&gt;
    mod = 666013&lt;br /&gt;
&lt;br /&gt;
    n %= mod&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        sol += (n - i) * (n - i) * (i + 1)&lt;br /&gt;
        sol %= mod&lt;br /&gt;
&lt;br /&gt;
    return sol&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    sol = calculate_sum(n)&lt;br /&gt;
    print(sol)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod definește trei funcții și o funcție principală:&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input(n) verifică dacă valoarea parametrului n este cuprinsă între 1 și 2.000.000.000, și aruncă o excepție ValueError dacă nu este.&lt;br /&gt;
&lt;br /&gt;
Funcția calculate_sum(n) primește un parametru n și calculează suma unei anumite formule matematice, bazată pe valoarea lui n și un număr constant (mod = 666013). Apoi, funcția returnează această sumă.&lt;br /&gt;
&lt;br /&gt;
Funcția main() citește un număr întreg de la tastatură, apelează funcția calculate_sum(n) pentru a calcula suma corespunzătoare, și apoi afișează rezultatul.&lt;br /&gt;
&lt;br /&gt;
Dacă acest script este rulat ca un program, atunci funcția main() este apelată.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2724_-_LSQ&amp;diff=5189</id>
		<title>2724 - LSQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2724_-_LSQ&amp;diff=5189"/>
		<updated>2023-04-28T08:00:49Z</updated>

		<summary type="html">&lt;p&gt;Cata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă o matrice binară (valori 0 și 1). Să se determine care este latura maximă a unui pătrat cu proprietatea că acesta are pe marginea sa doar valori 1.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare lsq.in conține pe prima linie numerele N și M, reprezentând numărul de linii și numărul de coloane ale matricei, apoi N linii, pe fiecare câte M valori 0 sau 1, neseparate prin niciun spațiu, reprezentând elementele matricei..&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire lsq.out va conține pe prima linie numărul L, reprezentând lungimea maximă a laturii unui pătrat ce conține doar 1 pe marginea sa.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; N, M &amp;amp;les; 1000&lt;br /&gt;
* Se consideră pătrat și cel de latură 1 (conține doar un element).&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; lsq.in&lt;br /&gt;
&lt;br /&gt;
: 7 7&lt;br /&gt;
: 0000000&lt;br /&gt;
: 0111100&lt;br /&gt;
: 0101111&lt;br /&gt;
: 0100101&lt;br /&gt;
: 0111111&lt;br /&gt;
: 0000011&lt;br /&gt;
: 0000011&lt;br /&gt;
; lsq.out&lt;br /&gt;
&lt;br /&gt;
: 4&lt;br /&gt;
; Consola&lt;br /&gt;
: Valid input&lt;br /&gt;
==Explicație==&lt;br /&gt;
&lt;br /&gt;
0 0 0 0 0 0 0&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1 1 1 1&amp;lt;/b&amp;gt; 0 0&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 0 1 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 0 0 &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; 0 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 &amp;lt;b&amp;gt;1 1 1 1&amp;lt;/b&amp;gt; 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 0 0 0 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 0 0 0 1 1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
Nmax = 1005&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def compute_matrices(N, M, A):&lt;br /&gt;
    LDL = [[0] * M for _ in range(N)]&lt;br /&gt;
    CDL = [[0] * M for _ in range(N)]&lt;br /&gt;
    LRU = [[0] * M for _ in range(N)]&lt;br /&gt;
    CRU = [[0] * M for _ in range(N)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(M):&lt;br /&gt;
            if A[i][j] == 1:&lt;br /&gt;
                LDL[i][j] = 1 + LDL[i][j - 1] if j &amp;gt; 0 else 1&lt;br /&gt;
                CDL[i][j] = 1 + CDL[i - 1][j] if i &amp;gt; 0 else 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(N - 1, -1, -1):&lt;br /&gt;
        for j in range(M - 1, -1, -1):&lt;br /&gt;
            if A[i][j] == 1:&lt;br /&gt;
                LRU[i][j] = 1 + LRU[i][j + 1] if j &amp;lt; M - 1 else 1&lt;br /&gt;
                CRU[i][j] = 1 + CRU[i + 1][j] if i &amp;lt; N - 1 else 1&lt;br /&gt;
&lt;br /&gt;
    return LDL, CDL, LRU, CRU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_largest_square(N, M, A):&lt;br /&gt;
    LDL, CDL, LRU, CRU = compute_matrices(N, M, A)&lt;br /&gt;
    ans = 0&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(M):&lt;br /&gt;
            for L in range(min(LDL[i][j], CDL[i][j]), ans, -1):&lt;br /&gt;
                if L &amp;lt;= min(LRU[i - L + 1][j - L + 1], CRU[i - L + 1][j - L + 1]):&lt;br /&gt;
                    ans = L&lt;br /&gt;
                    break&lt;br /&gt;
    return ans&lt;br /&gt;
&lt;br /&gt;
def validate_input(n: int, m: int) -&amp;gt; bool:&lt;br /&gt;
    return 1 &amp;lt;= n &amp;lt;= 1000 and 1 &amp;lt;= m &amp;lt;= 1000&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;lsq.in&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;lsq.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        A = [list(map(int, fin.readline().strip())) for _ in range(N)]&lt;br /&gt;
        if not validate_input(N, M):&lt;br /&gt;
            print(&amp;quot;Invalid input!&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Valid input&amp;quot;)&lt;br /&gt;
        ans = find_largest_square(N, M, A)&lt;br /&gt;
        fout.write(str(ans) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acesta este un program Python care calculează dimensiunea celui mai mare pătrat complet format din cifrele de 1 dintr-o matrice dată. Matricea este dată ca o listă de liste de cifre. Algoritmul folosit pentru a găsi răspunsul constă în calcularea a patru matrice auxiliare, folosind programarea dinamică pentru a calcula lungimea celui mai mare pătrat posibil cu colțul din stânga sus la poziția curentă. Apoi, se parcurge matricea și se caută cel mai mare pătrat complet, verificând dacă toate cele patru laturi au o lungime cel puțin egală cu dimensiunea pătratului. În caz afirmativ, se actualizează dimensiunea maximă a pătratului.&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input() verifică dacă intrarea este validă, adică dacă dimensiunea matricei se află între 1 și 1000 inclusiv. Funcția main() citește matricea din fișierul &amp;quot;lsq.in&amp;quot;, validează intrarea și apoi calculează și scrie dimensiunea celui mai mare pătrat complet în fișierul &amp;quot;lsq.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1735_-_divquery&amp;diff=5188</id>
		<title>1735 - divquery</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1735_-_divquery&amp;diff=5188"/>
		<updated>2023-04-28T07:59:05Z</updated>

		<summary type="html">&lt;p&gt;Cata: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
Se dă un vector indexat de la 1 cu n elemente numere naturale. Să se răspundă la q întrebări de forma x y, cu semnificația: “Care este cel mai mare divizor comun al elementelor cu indici cuprinși între x și y, inclusiv?”&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
Fișierul de intrare divquery.in conține pe prima linie numerele n și q, pe a doua linie cele n numere naturale ale vectorului, iar de la linia 3 începând, q linii, pe fiecare aflându-se doua numere x y, reprezentând întrebările.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
Fișierul de ieșire divquery.out va conține q linii, pe fiecare linie i aflându-se răspunsul la întrebarea i. În consolă se va afișa un mesaj de validare a datelor.&lt;br /&gt;
&lt;br /&gt;
==Restricții și precizări==&lt;br /&gt;
* 1 &amp;amp;les; n &amp;amp;les; 100.000&lt;br /&gt;
* 1 &amp;amp;les; ai &amp;amp;les; 100.000&lt;br /&gt;
* 1 &amp;amp;les; q &amp;amp;les; 1.000.000&lt;br /&gt;
==Exemplu==&lt;br /&gt;
; divquery.in&lt;br /&gt;
&lt;br /&gt;
: 5 4&lt;br /&gt;
: 1 3 18 2 3&lt;br /&gt;
: 1 5&lt;br /&gt;
: 2 3&lt;br /&gt;
: 3 4&lt;br /&gt;
: 2 4&lt;br /&gt;
; divquery.out&lt;br /&gt;
&lt;br /&gt;
: 1&lt;br /&gt;
: 3&lt;br /&gt;
: 2&lt;br /&gt;
: 1&lt;br /&gt;
; Consola&lt;br /&gt;
: Datele de intrare sunt valide!&lt;br /&gt;
==Explicație==&lt;br /&gt;
În intervalul [1,5] cmmdc-ul este 1&lt;br /&gt;
În intervalul [2,3] cmmdc-ul este 3&lt;br /&gt;
În intervalul [3,4] cmmdc-ul este 2&lt;br /&gt;
În intervalul [2,4] cmmdc-ul este 1&lt;br /&gt;
&lt;br /&gt;
==Rezolvare==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def cmmdc(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        r = a % b&lt;br /&gt;
        a = b&lt;br /&gt;
        b = r&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def read_input(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as fin:&lt;br /&gt;
        n, q = map(int, fin.readline().split())&lt;br /&gt;
        a = list(map(int, fin.readline().split()))&lt;br /&gt;
        queries = []&lt;br /&gt;
        for _ in range(q):&lt;br /&gt;
            x, y = map(int, fin.readline().split())&lt;br /&gt;
            queries.append((x, y))&lt;br /&gt;
    return n, a, queries&lt;br /&gt;
&lt;br /&gt;
def compute_logs(n):&lt;br /&gt;
    logs = [0] * (n+1)&lt;br /&gt;
    for i in range(2, n+1):&lt;br /&gt;
        logs[i] = 1 + logs[i//2]&lt;br /&gt;
    return logs&lt;br /&gt;
&lt;br /&gt;
def compute_sparse_table(a):&lt;br /&gt;
    n = len(a)&lt;br /&gt;
    logs = compute_logs(n)&lt;br /&gt;
    st = [[0]*n for _ in range(logs[n]+1)]&lt;br /&gt;
    st[0] = a&lt;br /&gt;
    for i in range(1, logs[n]+1):&lt;br /&gt;
        for j in range(n-(1&amp;lt;&amp;lt;i)+1):&lt;br /&gt;
            st[i][j] = cmmdc(st[i-1][j], st[i-1][j+(1&amp;lt;&amp;lt;(i-1))])&lt;br /&gt;
    return st, logs&lt;br /&gt;
&lt;br /&gt;
def process_queries(a, queries, st, logs):&lt;br /&gt;
    results = []&lt;br /&gt;
    for x, y in queries:&lt;br /&gt;
        dif = y - x + 1&lt;br /&gt;
        l = logs[dif]&lt;br /&gt;
        dif = dif - (1 &amp;lt;&amp;lt; l)&lt;br /&gt;
        res = cmmdc(st[l][x-1], st[l][x-1+dif])&lt;br /&gt;
        results.append(res)&lt;br /&gt;
    return results&lt;br /&gt;
&lt;br /&gt;
def write_output(filename, results):&lt;br /&gt;
    with open(filename, &#039;w&#039;) as fout:&lt;br /&gt;
        for res in results:&lt;br /&gt;
            fout.write(str(res) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, a, q):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= x &amp;lt;= 100000 for x in a):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= x &amp;lt;= 1000000 for x in q):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, a, queries = read_input(&#039;divquery.in&#039;)&lt;br /&gt;
    if not validate_input(n, a, queries):&lt;br /&gt;
        print(&amp;quot;Datele de intrare nu sunt valide!&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele de intrare sunt valide!&amp;quot;)&lt;br /&gt;
    st, logs = compute_sparse_table(a)&lt;br /&gt;
    results = process_queries(a, queries, st, logs)&lt;br /&gt;
    write_output(&#039;divquery.out&#039;, results)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicație cod==&lt;br /&gt;
Acest cod este o implementare a unei soluții pentru problema &amp;quot;DivQuery&amp;quot;, care se ocupă cu determinarea celui mai mare divizor comun dintr-un interval dat dintr-un șir de numere.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;cmmdc(a, b)&amp;quot; calculează cel mai mare divizor comun dintre două numere folosind algoritmul Euclid.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;read_input(filename)&amp;quot; citește datele de intrare dintr-un fișier și returnează numărul de elemente din șir (n), lista cu elementele (a) și o listă cu perechi de numere (queries), reprezentând intervalele pentru care trebuie calculat cel mai mare divizor comun.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;compute_logs(n)&amp;quot; calculează logaritmul în baza 2 pentru numerele de la 2 la n și returnează o listă cu valorile obținute. Aceste valori sunt utilizate pentru a determina numărul de niveluri din tabelul rar.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;compute_sparse_table(a)&amp;quot; construiește un tabel rar (sparse table) pentru șirul de numere dat (a). Tabelul este reprezentat ca o matrice (st) cu (logs[n]+1) niveluri și n coloane. Primul nivel al matricei conține elementele din șir, iar fiecare nivel următor se construiește pe baza nivelului precedent. Matricea este construită astfel încât pentru orice subinterval din șir se poate calcula cel mai mare divizor comun folosind două valori din tabelul rar.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;process_queries(a, queries, st, logs)&amp;quot; calculează cel mai mare divizor comun pentru fiecare interval din lista de intervale (queries) folosind tabela rară și returnează o listă cu rezultatele obținute.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;write_output(filename, results)&amp;quot; scrie rezultatele într-un fișier de ieșire.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;validate_input(n, a, q)&amp;quot; verifică dacă datele de intrare sunt valide, adică numărul de elemente din șir să fie între 1 și 100000, elementele din șir să fie între 1 și 100000, iar intervalele să fie între 1 și 1000000.&lt;br /&gt;
&lt;br /&gt;
Funcția &amp;quot;main()&amp;quot; este funcția principală care apelează celelalte funcții pentru a rezolva problema și afișează un mesaj de eroare în cazul în care datele de intrare nu sunt valide.&lt;br /&gt;
&lt;br /&gt;
În final, condiția &amp;quot;if name == &#039;main&#039;:&amp;quot; verifică dacă codul este rulat ca script și apelează funcția principală.&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
</feed>