<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2440_-_puzzle</id>
	<title>2440 - puzzle - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=2440_-_puzzle"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2440_-_puzzle&amp;action=history"/>
	<updated>2026-05-01T06:49:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2440_-_puzzle&amp;diff=9048&amp;oldid=prev</id>
		<title>Miawinator: Pagină nouă: Mihai a primit de ziua lui un joc de puzzle. Jocul are &lt;code&gt;N&lt;/code&gt; piese confecţionate prin lipirea unor bucăţi de dimensiune &lt;code&gt;1x1&lt;/code&gt; (ilustrate în figurile de mai jos prin &lt;code&gt;X&lt;/code&gt;); aceste bucăţi le vom numi în continuare, pe scurt, &lt;code&gt;X&lt;/code&gt;-uri. Pentru confecţionarea unei piese se respectă următoarele reguli:  1. &lt;code&gt;X&lt;/code&gt;-urile sunt aşezate unul peste altul, formând coloane ce pot avea înălţimi diferite, apoi coloanele se alinia...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2440_-_puzzle&amp;diff=9048&amp;oldid=prev"/>
		<updated>2024-01-05T00:03:29Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: Mihai a primit de ziua lui un joc de puzzle. Jocul are &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; piese confecţionate prin lipirea unor bucăţi de dimensiune &amp;lt;code&amp;gt;1x1&amp;lt;/code&amp;gt; (ilustrate în figurile de mai jos prin &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;); aceste bucăţi le vom numi în continuare, pe scurt, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;-uri. Pentru confecţionarea unei piese se respectă următoarele reguli:  1. &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;-urile sunt aşezate unul peste altul, formând coloane ce pot avea înălţimi diferite, apoi coloanele se alinia...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Mihai a primit de ziua lui un joc de puzzle. Jocul are &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; piese confecţionate prin lipirea unor bucăţi de dimensiune &amp;lt;code&amp;gt;1x1&amp;lt;/code&amp;gt; (ilustrate în figurile de mai jos prin &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;); aceste bucăţi le vom numi în continuare, pe scurt, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;-uri. Pentru confecţionarea unei piese se respectă următoarele reguli:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;-urile sunt aşezate unul peste altul, formând coloane ce pot avea înălţimi diferite, apoi coloanele se aliniază în partea de jos şi se lipesc între ele, una după cealaltă, de la stânga spre dreapta;&lt;br /&gt;
&lt;br /&gt;
2. pe o coloană sunt cel mult nouă &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;-uri;&lt;br /&gt;
&lt;br /&gt;
3. toate piesele au acelaşi număr de coloane.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
În figurile 1, 2, 3, 4 sunt piese de puzzle care respectă regulile descrise, iar în figura 5 și în figura 6 NU sunt piese de puzzle, pentru că nu pot fi obţinute prin lipirea unor coloane de &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;-uri, una după cealaltă, de la stânga spre dreapta.&lt;br /&gt;
&lt;br /&gt;
Fiind mic, Mihai nu poate rezolva puzzle-ul, dar poate face o singură operaţie: alege două piese şi le îmbină în dreptul laturilor de sus, răsturnând una dintre piese sus-jos (fără să o rotească sau să o răstoarne stânga-dreapta). Dacă în urma acestei operaţii el obţine un dreptunghi format din coloane complete de &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;-uri, toate coloanele având aceeaşi înălţime, este mulţumit. De exemplu, piesa din figura 1 și cea din figura 2 pot fi îmbinate în modul descris.&lt;br /&gt;
&lt;br /&gt;
În figura 7 este piesa din figura 2 răsturnată sus-jos. În figura 8 este ilustrat dreptunghiul care se obţine din piesa din figura 1 şi piesa din figura 2 răsturnată sus-jos.&lt;br /&gt;
&lt;br /&gt;
Observaţi că, dacă am roti piesa din figura 4, am putea să o îmbinăm cu piesa din figura 1, dar rotaţia nu este permisă.&lt;br /&gt;
&lt;br /&gt;
Vom codifica o piesă printr-un număr natural, fiecare cifră din număr reprezentând (în ordine de la stânga la dreapta) câte &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;-uri se află pe coloana corespunzătoare din piesă.&lt;br /&gt;
&lt;br /&gt;
De exemplu:&lt;br /&gt;
&lt;br /&gt;
– piesa din figura 1 este codificată &amp;lt;code&amp;gt;4232&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
– piesa din figura 2 este codificată &amp;lt;code&amp;gt;1323&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
– piesa din figura 3 este codificată &amp;lt;code&amp;gt;4444&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
– piesa din figura 4 este codificată &amp;lt;code&amp;gt;3231&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Determinați care este numărul de moduri în care Mihai poate alege câte două piese dintre cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; pentru a face o operaţie în modul descris mai sus.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;input.txt&amp;lt;/code&amp;gt; conține pe prima linie un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; ce reprezintă numărul de piese din joc. Pe linia a doua se găsesc &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale, separate prin câte un singur spațiu, reprezentând codificările celor &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; piese.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;output.txt&amp;lt;/code&amp;gt; va conține o singură linie pe care va fi scris numărul cerut.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N ≤ 100 000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
input.txt:&lt;br /&gt;
&lt;br /&gt;
5&lt;br /&gt;
&lt;br /&gt;
222 432 234 123 111&lt;br /&gt;
&lt;br /&gt;
output.txt:&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
&lt;br /&gt;
Explicație:&lt;br /&gt;
&lt;br /&gt;
Se pot îmbina &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; perechi de piese: piesa &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; cu piesa &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, piesa &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; cu piesa &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, piesa &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; cu piesa &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;. Piesele &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; s-ar putea îmbina corect dacă una dintre ele ar fi răsturnată stânga-dreapta sau rotită, dar acest lucru nu e permis.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
input.txt:&lt;br /&gt;
&lt;br /&gt;
99999999999999999&lt;br /&gt;
&lt;br /&gt;
32 3 2 1 31 4 1&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&lt;br /&gt;
Input-ul nu convine conditiilor&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare(n):&lt;br /&gt;
    if not(2&amp;lt;=n&amp;lt;=100000):&lt;br /&gt;
        print(&amp;quot;Input-ul nu convine conditiilor&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
f = [0] * 100001&lt;br /&gt;
v = []&lt;br /&gt;
frecv = [0] * 12&lt;br /&gt;
rez = 0&lt;br /&gt;
n = 0&lt;br /&gt;
k = 0&lt;br /&gt;
&lt;br /&gt;
def fa(numar):&lt;br /&gt;
    global frecv&lt;br /&gt;
    t = 0&lt;br /&gt;
    mi = 9&lt;br /&gt;
    while numar:&lt;br /&gt;
        t += 1&lt;br /&gt;
        frecv[t] = numar % 10&lt;br /&gt;
        numar //= 10&lt;br /&gt;
        if frecv[t] &amp;lt; mi:&lt;br /&gt;
            mi = frecv[t]&lt;br /&gt;
    r = 0&lt;br /&gt;
    for i in range(t, 0, -1):&lt;br /&gt;
        r = r * 10 + (frecv[i] - mi)&lt;br /&gt;
    return r&lt;br /&gt;
&lt;br /&gt;
def intoarce(code, k):&lt;br /&gt;
    global frecv&lt;br /&gt;
    t = 0&lt;br /&gt;
    aux = code&lt;br /&gt;
    ma = 0&lt;br /&gt;
    for i in range(1, k + 1):&lt;br /&gt;
        t += 1&lt;br /&gt;
        frecv[t] = aux % 10&lt;br /&gt;
        aux //= 10&lt;br /&gt;
        ma = max(ma, frecv[t])&lt;br /&gt;
    r = 0&lt;br /&gt;
    for i in range(t, 0, -1):&lt;br /&gt;
        r = r * 10 + (ma - frecv[i])&lt;br /&gt;
    return r&lt;br /&gt;
&lt;br /&gt;
def lungime_nr(n):&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    while n:&lt;br /&gt;
        cnt += 1&lt;br /&gt;
        n //= 10&lt;br /&gt;
    return cnt&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;input.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;output.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    n = int(fin.readline().strip())&lt;br /&gt;
    verificare(n)&lt;br /&gt;
    v = list(map(int, fin.readline().split()))&lt;br /&gt;
    if n &amp;gt; 0:&lt;br /&gt;
        k = lungime_nr(v[0])&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        f[fa(v[i - 1])] += 1&lt;br /&gt;
&lt;br /&gt;
    rez = 0&lt;br /&gt;
    for i in range(1, 100001):&lt;br /&gt;
        rez += 1 * f[i] * f[intoarce(i, k)]&lt;br /&gt;
&lt;br /&gt;
    rez //= 2&lt;br /&gt;
    rez += 1 * f[0] * (f[0] - 1) // 2&lt;br /&gt;
    fout.write(str(rez) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Miawinator</name></author>
	</entry>
</feed>