2194 - identice3: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Enunt == Mihai a construit o matrice pătratică A de dimensiune N cu valori în mulțimea {0,1}. El preferă acele matrice care au toate elementele identice și de aceea a calculat pentru matricea A, numărul K de submatrice care au toate elementele identice. Acum, Mihai vrea să transforme matricea A într-o matrice cu toate elementele identice. Pentru aceasta, el a selectat un număr natural nenul D, și definește operația ZET care constă în alegerea unei submatri...
 
No edit summary
 
Line 1: Line 1:
== Enunt ==  
== Enunt ==  


Mihai a construit o matrice pătratică A de dimensiune N cu valori în mulțimea {0,1}. El preferă acele matrice care au toate elementele identice și de aceea a calculat pentru matricea A, numărul K de submatrice care au toate elementele identice. Acum, Mihai vrea să transforme matricea A într-o matrice cu toate elementele identice. Pentru aceasta, el a selectat un număr natural nenul D, și definește operația ZET care constă în alegerea unei submatrice pătratice de dimensiunea D din matricea precedentă în care schimbă toate elementele 0 în 1 și invers. El vrea să aplice operația ZET inițial pentru matricea A, apoi repetă operația pentru matricea obținută la momentul anterior, de un număr minim de ori, notat R, până când matricea obținută are toate elementele identice, sau dacă nu este posibil, R va avea valoarea -1.
Mihai a construit o matrice pătratică <code>A</code> de dimensiune <code>N</code> cu valori în mulțimea <code>{0,1}</code>. El preferă acele matrice care au toate elementele identice și de aceea a calculat pentru matricea <code>A</code>, numărul <code>K</code> de submatrice care au toate elementele identice. Acum, Mihai vrea să transforme matricea <code>A</code> într-o matrice cu toate elementele identice. Pentru aceasta, el a selectat un număr natural nenul <code>D</code>, și definește operația ZET care constă în alegerea unei submatrice pătratice de dimensiunea <code>D</code> din matricea precedentă în care schimbă toate elementele <code>0</code> în <code>1</code> și invers. El vrea să aplice operația ZET inițial pentru matricea <code>A</code>, apoi repetă operația pentru matricea obținută la momentul anterior, de un număr minim de ori, notat <code>R</code>, până când matricea obținută are toate elementele identice, sau dacă nu este posibil, <code>R</code> va avea valoarea <code>-1</code>.


== Cerinta ==
= Cerința =
Mihai vă roagă să calculați valorile <code>K</code> și <code>R</code>. Pentru a preciza tipul cerinței, Mihai folosește un cod <code>T</code> care dacă are valoarea <code>1</code>, atunci solicită calcularea valorii <code>K</code>, iar dacă <code>T</code> are valoarea <code>2</code>, atunci solicită calcularea valorii <code>R</code>.


Mihai vă roagă să calculați valorile K și R. Pentru a preciza tipul cerinței, Mihai folosește un cod T care dacă are valoarea 1, atunci solicită calcularea valorii K, iar dacă T are valoarea 2, atunci solicită calcularea valorii R.
= Date de intrare =
Fișierul de intrare <code>identice3IN.txt</code> se vor afla numerele naturale <code>T</code>, <code>N</code> și <code>D</code>, cu semnificația de mai sus, separate prin câte un spațiu. Pe următoarele <code>N</code> linii se vor afla câte <code>N</code> valori de <code>0</code> și <code>1</code>, elementele liniilor matricei <code>A</code>, fără spații între ele.


== Date de intrare ==
= Date de ieșire =
Fișierul de ieșire <code>identice3OUT.txt</code> se va afla un număr natural, respectiv valoarea <code>K</code> pentru <code>T = 1</code> sau valoarea <code>R</code> pentru <code>T = 2</code>.


Fișierul de intrare identice3.in se vor afla numerele naturale T, N și D, cu semnificația de mai sus, separate prin câte un spațiu. Pe următoarele N linii se vor afla câte N valori de 0 și 1, elementele liniilor matricei A, fără spații între ele.
= Restricții și precizări =


== Date de ieșire ==
* <code>1 < D < N ≤ 1000</code>
* Pentru calcularea valorii <code>K</code>, submatricele pot fi pătratice sau dreptunghiulare, cu diferite dimensiuni (inclusiv <code>1</code>), cu elementele identice.


Fișierul de ieșire identice3.out se va afla un număr natural, respectiv valoarea K pentru T = 1 sau valoarea R pentru T = 2.
= Exemplul 1: =
<code>identice3IN.txt</code>
1 4 2
0011
0011
1100
1100
<code>identice3OUT.txt</code>
36


== Restrictii si precizari ==
=== Explicație ===
<code>T = 1</code>, deci se calculează <code>K = 36</code>. Sunt <code>18</code> submatrice cu toate elementele <code>0</code> și <code>18</code> cu toate elementele <code>1</code>.


*1 < D < N ≤ 1000
= Exemplul 2: =
*Pentru calcularea valorii K, submatricele pot fi pătratice sau dreptunghiulare, cu diferite dimensiuni (inclusiv 1), cu elementele identice.
<code>identice3IN.txt</code>
2 4 2
0011
0011
1100
1100
<code>identice3OUT.txt</code>
2


== Exemplul 1 ==
=== Explicație ===
<code>T = 2</code>, deci se calculează <code>R = 2</code>, deoarece sunt necesare <code>2</code> aplicări ale operației ZET.


; intrare
== Exemplul 3: ==
<code>identice3IN.txt</code>
1 1001 2
0011
0011
1100
1100
<code>identice3OUT.txt</code>
Datele nu corespund restrictiilor impuse


:1 4 2
=== Rezolvare ===
 
<syntaxhighlight lang="python3" line="1">
:0011
Nmax = 1005
 
opus = {'0': '1', '1': '0'}
:0011
t0 = [[0] * Nmax for _ in range(Nmax)]
 
st0 = [0] * Nmax
:1100
val0 = [0] * Nmax
 
t1 = [[0] * Nmax for _ in range(Nmax)]
:1100
st1 = [0] * Nmax
 
val1 = [0] * Nmax
; iesire
M0 = [[0] * Nmax for _ in range(Nmax)]
 
M1 = [[0] * Nmax for _ in range(Nmax)]
:Datele introduse corespund restrictiilor impuse.
p0 = [0] * Nmax
p1 = [0] * Nmax


:36
def check_restrictions():
    return 1 < d < n <= 1000


== Exemplul 2 ==
def read():
    global test, n, d, a, a1
    with open("identice3IN.txt", 'r') as in_file:
        test, n, d = map(int, in_file.readline().split())
        if not check_restrictions():
            return False
        a = [[''] * (n + 2) for _ in range(n + 2)]  # Adjusted size
        a1 = [[''] * (n + 1) for _ in range(n + 1)]  # Adjusted size
        for i in range(1, n + 1):
            a[i][1:n + 1] = in_file.readline().strip()
            for j in range(1, n + 1):
                a1[i][j] = opus[a[i][j]]
        return True


; intrare
def solve0():
    global sum0, a
    sum0 = 0
    for j in range(1, n + 1):
        vf0 = 0
        for i in range(1, n + 1):
            if a[i][j] == '0':
                t0[i][j + 1] = 1 + t0[i][j]
            m = 1
            while vf0 > 0 and st0[vf0] >= t0[i][j + 1]:
                m += val0[vf0]
                vf0 -= 1
            vf0 += 1
            st0[vf0] = t0[i][j + 1]
            val0[vf0] = m
            sum0 += val0[vf0] * st0[vf0]


:10 9 5
def solve1():
 
    global sum1, a
:1100
    sum1 = 0
 
    for j in range(1, n + 1):
:1010
        vf1 = 0
 
        for i in range(1, n + 1):
:0011
            if a[i][j] == '1':
 
                t1[i][j + 1] = 1 + t1[i][j]
:0101
            m = 1
 
            while vf1 > 0 and st1[vf1] >= t1[i][j + 1]:
; iesire
                m += val1[vf1]
 
                vf1 -= 1
:Datele de intrare nu corespund restrictiilor impuse.
            vf1 += 1
 
            st1[vf1] = t1[i][j + 1]
== Rezolvare ==  
            val1[vf1] = m
<syntaxhighlight lang="python3" line="1">
            sum1 += val1[vf1] * st1[vf1]


#2194 - identice3
def R0():
    global sol0, a
    sol0 = 0
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            M0[i][j] += M0[i - 1][j]
            p0[j] = p0[j - 1] + M0[i][j]
            t = p0[j] & 1
            if i > n - d + 1 or j > n - d + 1:
                if t != int(a[i][j]):
                    return -1
            elif t != int(a[i][j]):
                sol0 += 1
                M0[i][j] += 1
                M0[i + d][j] -= 1
                M0[i][j + d] -= 1
                M0[i + d][j + d] += 1
                p0[j] += 1
    return sol0


def count_K(N):
def R1():
     K = 0
     global sol1, a
     for D in range(1, N+1):
    sol1 = 0
         K += (N - D + 1) ** 2
     for i in range(1, n + 1):
     return K
         for j in range(1, n + 1):
            M1[i][j] += M1[i - 1][j]
            p1[j] = p1[j - 1] + M1[i][j]
            t = p1[j] & 1
            if i > n - d + 1 or j > n - d + 1:
                if t != int(a1[i][j]):
                    return -1
            elif t != int(a1[i][j]):
                sol1 += 1
                M1[i][j] += 1
                M1[i + d][j] -= 1
                M1[i][j + d] -= 1
                M1[i + d][j + d] += 1
                p1[j] += 1
     return sol1


def apply_ZET(matrix, D):
def main():
     new_matrix = [row.copy() for row in matrix]
     if not read():
    for i in range(len(matrix) - D + 1):
         with open("identice3OUT.txt", 'w') as out_file:
         for j in range(len(matrix[0]) - D + 1):
             out_file.write("Datele nu corespund restrictiilor impuse\n")
             for x in range(D):
        return
                for y in range(D):
                    new_matrix[i + x][j + y] = 1 - matrix[i + x][j + y]
    return new_matrix


def count_R(matrix):
    if test == 1:
     R = 0
        solve0()
    while len(set(matrix[0])) > 1 or any(matrix[i] != matrix[0] for i in range(1, len(matrix))):
        solve1()
         matrix = apply_ZET(matrix, R + 1)
        with open("identice3OUT.txt", 'w') as out_file:
         R += 1
            out_file.write(str(sum0 + sum1) + '\n')
         if R > min(len(matrix), len(matrix[0])):
     else:
             return -1
        R0_result = R0()
    return R
        R1_result = R1()
        rx = min(R0_result, R1_result)
         ry = max(R0_result, R1_result)
         if rx == -1:
            rx = ry
         with open("identice3OUT.txt", 'w') as out_file:
             out_file.write(str(rx) + '\n')


if T == 1:
if __name__ == "__main__":
    K = count_K(N)
     main()
    print(f"Valoarea lui K este: {K}")
elif T == 2:
    R = count_R(matrix_A)
    print(f"Valoarea lui R este: {R}")
else:
     print("Valoarea T trebuie să fie 1 sau 2.")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 23:23, 22 March 2024

Enunt[edit | edit source]

Mihai a construit o matrice pătratică A de dimensiune N cu valori în mulțimea {0,1}. El preferă acele matrice care au toate elementele identice și de aceea a calculat pentru matricea A, numărul K de submatrice care au toate elementele identice. Acum, Mihai vrea să transforme matricea A într-o matrice cu toate elementele identice. Pentru aceasta, el a selectat un număr natural nenul D, și definește operația ZET care constă în alegerea unei submatrice pătratice de dimensiunea D din matricea precedentă în care schimbă toate elementele 0 în 1 și invers. El vrea să aplice operația ZET inițial pentru matricea A, apoi repetă operația pentru matricea obținută la momentul anterior, de un număr minim de ori, notat R, până când matricea obținută are toate elementele identice, sau dacă nu este posibil, R va avea valoarea -1.

Cerința[edit | edit source]

Mihai vă roagă să calculați valorile K și R. Pentru a preciza tipul cerinței, Mihai folosește un cod T care dacă are valoarea 1, atunci solicită calcularea valorii K, iar dacă T are valoarea 2, atunci solicită calcularea valorii R.

Date de intrare[edit | edit source]

Fișierul de intrare identice3IN.txt se vor afla numerele naturale T, N și D, cu semnificația de mai sus, separate prin câte un spațiu. Pe următoarele N linii se vor afla câte N valori de 0 și 1, elementele liniilor matricei A, fără spații între ele.

Date de ieșire[edit | edit source]

Fișierul de ieșire identice3OUT.txt se va afla un număr natural, respectiv valoarea K pentru T = 1 sau valoarea R pentru T = 2.

Restricții și precizări[edit | edit source]

  • 1 < D < N ≤ 1000
  • Pentru calcularea valorii K, submatricele pot fi pătratice sau dreptunghiulare, cu diferite dimensiuni (inclusiv 1), cu elementele identice.

Exemplul 1:[edit | edit source]

identice3IN.txt

1 4 2
0011
0011
1100
1100

identice3OUT.txt

36

Explicație[edit | edit source]

T = 1, deci se calculează K = 36. Sunt 18 submatrice cu toate elementele 0 și 18 cu toate elementele 1.

Exemplul 2:[edit | edit source]

identice3IN.txt

2 4 2
0011
0011
1100
1100

identice3OUT.txt

2

Explicație[edit | edit source]

T = 2, deci se calculează R = 2, deoarece sunt necesare 2 aplicări ale operației ZET.

Exemplul 3:[edit | edit source]

identice3IN.txt

1 1001 2
0011
0011
1100
1100

identice3OUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> Nmax = 1005 opus = {'0': '1', '1': '0'} t0 = [[0] * Nmax for _ in range(Nmax)] st0 = [0] * Nmax val0 = [0] * Nmax t1 = [[0] * Nmax for _ in range(Nmax)] st1 = [0] * Nmax val1 = [0] * Nmax M0 = [[0] * Nmax for _ in range(Nmax)] M1 = [[0] * Nmax for _ in range(Nmax)] p0 = [0] * Nmax p1 = [0] * Nmax

def check_restrictions():

   return 1 < d < n <= 1000

def read():

   global test, n, d, a, a1
   with open("identice3IN.txt", 'r') as in_file:
       test, n, d = map(int, in_file.readline().split())
       if not check_restrictions():
           return False
       a = [[] * (n + 2) for _ in range(n + 2)]  # Adjusted size
       a1 = [[] * (n + 1) for _ in range(n + 1)]  # Adjusted size
       for i in range(1, n + 1):
           a[i][1:n + 1] = in_file.readline().strip()
           for j in range(1, n + 1):
               a1[i][j] = opus[a[i][j]]
       return True

def solve0():

   global sum0, a
   sum0 = 0
   for j in range(1, n + 1):
       vf0 = 0
       for i in range(1, n + 1):
           if a[i][j] == '0':
               t0[i][j + 1] = 1 + t0[i][j]
           m = 1
           while vf0 > 0 and st0[vf0] >= t0[i][j + 1]:
               m += val0[vf0]
               vf0 -= 1
           vf0 += 1
           st0[vf0] = t0[i][j + 1]
           val0[vf0] = m
           sum0 += val0[vf0] * st0[vf0]

def solve1():

   global sum1, a
   sum1 = 0
   for j in range(1, n + 1):
       vf1 = 0
       for i in range(1, n + 1):
           if a[i][j] == '1':
               t1[i][j + 1] = 1 + t1[i][j]
           m = 1
           while vf1 > 0 and st1[vf1] >= t1[i][j + 1]:
               m += val1[vf1]
               vf1 -= 1
           vf1 += 1
           st1[vf1] = t1[i][j + 1]
           val1[vf1] = m
           sum1 += val1[vf1] * st1[vf1]

def R0():

   global sol0, a
   sol0 = 0
   for i in range(1, n + 1):
       for j in range(1, n + 1):
           M0[i][j] += M0[i - 1][j]
           p0[j] = p0[j - 1] + M0[i][j]
           t = p0[j] & 1
           if i > n - d + 1 or j > n - d + 1:
               if t != int(a[i][j]):
                   return -1
           elif t != int(a[i][j]):
               sol0 += 1
               M0[i][j] += 1
               M0[i + d][j] -= 1
               M0[i][j + d] -= 1
               M0[i + d][j + d] += 1
               p0[j] += 1
   return sol0

def R1():

   global sol1, a
   sol1 = 0
   for i in range(1, n + 1):
       for j in range(1, n + 1):
           M1[i][j] += M1[i - 1][j]
           p1[j] = p1[j - 1] + M1[i][j]
           t = p1[j] & 1
           if i > n - d + 1 or j > n - d + 1:
               if t != int(a1[i][j]):
                   return -1
           elif t != int(a1[i][j]):
               sol1 += 1
               M1[i][j] += 1
               M1[i + d][j] -= 1
               M1[i][j + d] -= 1
               M1[i + d][j + d] += 1
               p1[j] += 1
   return sol1

def main():

   if not read():
       with open("identice3OUT.txt", 'w') as out_file:
           out_file.write("Datele nu corespund restrictiilor impuse\n")
       return
   if test == 1:
       solve0()
       solve1()
       with open("identice3OUT.txt", 'w') as out_file:
           out_file.write(str(sum0 + sum1) + '\n')
   else:
       R0_result = R0()
       R1_result = R1()
       rx = min(R0_result, R1_result)
       ry = max(R0_result, R1_result)
       if rx == -1:
           rx = ry
       with open("identice3OUT.txt", 'w') as out_file:
           out_file.write(str(rx) + '\n')

if __name__ == "__main__":

   main()

</syntaxhighlight>