const max_rows = 3; max_cols = 4; MaxNij=4; type TType = real; mxType = array[1 .. max_rows, 1 .. max_cols] of TType; const arr: mxType = (( 1, -2, -3, 0), ( 2, 3, 8, 7), (-1, 1, 1, -1)); function incr_(var x: integer): integer; begin incr_ := x; inc(x) end; function decr_(var x: integer): integer; begin decr_ := x; dec(x) end; function minusOnePower(n: integer): integer; begin minusOnePower := (1 - 2*byte(odd(n))); end; function opr(const a: mxType; k: word): TType; var B: mxType; i, j, E: word; q: integer; s: TType; begin if k = 2 then { stop recurse } Opr:= a[1, 1] * a[2, 2] - a[1, 2] * a[2, 1] else begin s := 0; for E := 1 to K do begin for i := 2 to K do begin q := 1; for j := 1 to K do if (j <> E) then B[pred(i), incr_(q)] := a[i, j] end; s := s + minusOnePower(E) * a[1, E] * Opr(B, pred(k)) end; Opr := s end end; function get_rang(ni, nj: integer; a: mxType): integer; type TVariant = (Process, Ok, Stop); var T1, T2: mxType; Pi, Pj: array[0 .. maxNij] of byte; i, j, k: integer; whatInPi: array[1 .. max_rows] of boolean; whatInPj: array[1 .. max_cols] of boolean; f, f2: TVariant; Opred: TType; const flag: boolean = false; rang: integer = 0; begin k := 1; for i := 1 to pred(ni) do Pi[i] := i; Pi[ni] := pred(ni); while not flag do begin for i := 1 to pred(nj) do Pj[i] := i; Pj[nj] := pred(nj); f := Process; while f = Process do begin i := ni; inc(Pi[i]); while (i <> 0) and (Pi[i] > ni) do begin Pi[decr_(i)] := 1; inc(Pi[i]) end; if i = 0 then begin f := Stop; flag := true end else begin for i := 1 to ni do WhatInPi[i] := false; i := 1; while (i <= ni) and (not WhatInPi[Pi[i]]) do WhatInPi[Pi[incr_(I)]] := true; if i > ni then f := Ok end; end; f2 := Process; while (f2 <> Stop) and (not flag) do begin f2 := Process; while f2 = Process do begin i := nj; inc(Pj[i]); while (i <> 0) and (Pj[i] > nj) do begin Pj[decr_(i)] := 1; inc(Pj[i]) end; if i = 0 then f2 := Stop else begin for i := 1 to nj do WhatInPj[i] := false; i := 1; while (i <= nj) and (not WhatInPj[Pj[i]]) do WhatInPj[Pj[incr_(i)]] := true; if i > nj then f2 := Ok end; end; if f2 = Ok then begin for i := 1 to ni do for j := 1 to nj do T1[i, j] := a[Pi[i], j]; for i := 1 to k do for j := 1 to k do T2[i, j] := T1[i, Pj[j]]; if k > 1 then Opred := Opr(T2, k) else Opred := T2[1, 1]; if Opred <> 0 then f2 := Stop end end; if (Opred <> 0) and (not flag) then begin rang := incr_(k); for i := 1 to pred(ni) do Pi[i] := i; Pi[ni] := pred(ni) end; flag := (k > ni) or (k > nj) or flag end; get_rang := rang end; begin writeln('rang = ', get_rang(max_rows, max_cols, arr)) end.