Rezolvare completă PbInfo #743 Operatii

Fiind date două tablouri bidimensionale a şi b, cu m linii şi n coloane fiecare, definim următoarele operaţii:

1. suma tablourilor a şi b, ca fiind un tablou c cu m linii şi n coloane, în care fiecare element este egal cu suma elementelor de pe aceeași linie şi aceeași coloană din a şi b. În acest caz folosim operatorul +, adică c=a+b.
2. produsul tablourilor a şi b, ca fiind un tablou d cu m linii şi n coloane, în care fiecare element este egal cu produsul elementelor de pe aceeași linie şi aceeași coloană din a şi b. În acest caz folosim operatorul *, adică d=a*b. Dacă a şi b sunt tablouri identice (a şi b au elemente identice pe aceeaşi poziţie), atunci pentru d se mai foloseşte şi notaţia a2 sau b2.

De exemplu, pentru m=2, n=3 şi tablourile:

se obține:

Cerința

Fiind dat un tablou bidimensional a, cu m linii, n coloane şi componente numere naturale dorim să determinăm un şir de tablouri bidimensionale: b1, b2, …, bk cu număr minim de termeni (k minim), cu proprietatea că a=b12+b22...+bk2.

Date de intrare

Fișierul de intrare operatii.in conține pe prima linie numerele naturale m şi n separate prin câte un spaţiu. Pe umătoarele m linii se află elementele tabloului a, câte n numere pe o linie, în cadrul unei linii numerele fiind separate între ele prin câte un spaţiu.

Date de ieșire

Fișierul de ieșire operatii.out va conține pe prima linie un număr natural reprezentând valoarea k, apoi pe următoarele k*m linii elementele celor k tablouri b1, b2, …, bk. Fiecare dintre aceste tablouri va fi scris pe câte m linii consecutive, iar pe fiecare dintre aceste linii se vor afla câte n numere separate prin câte un spaţiu.

Restricții și precizări

  • 1 ≤ m,n ≤ 200
  • Componentele tabloului a sunt numere naturale ≤ 10000.
  • Pot exista mai multe soluții, dar în fişierul de ieşire se va scrie una dintre ele.
  • 30% din teste au componentele tabloului a mai mici sau cel mult egale cu 100 şi m,n≤ 100.
  • 60% din teste au componentele tabloului a mai mici sau cel mult egale cu 1000.

Exemplu

operatii.in

2 3
1 2 4
5 5 9

operatii.out

2
1 1 0
2 2 3
0 1 2
1 1 0

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Operatii:

{$r-}
const nmax = 10000;
      kmax = 10;
var f,g:text;
    n1,n2,n3,aux,q,kmx,k,buf,nl,nc,i,j,sum:integer;
    a : array[1..201,1..201] of longint;
    x:array[0..nmax,0..kmax] of integer;

begin
  kmx:=0;
  assign(g,'operatii.out'); rewrite(g);
  for i := 0 to nmax do
    x[i][0]:=nmax;

  for i := 1 to trunc(sqrt(nmax)) do
  begin
    x[i*i][0]:=1;
    x[i*i][1]:=i*i
  end;

  for i := 1 to nmax do
   if x[i][0]=nmax then
     for n1 := 1 to trunc(sqrt(i)) do
       begin
        aux := i-n1*n1;
        if aux>0 then
        if trunc(sqrt(aux)) = sqrt(aux) then
          begin
            x[i][0]:=2;x[i][1]:=n1*n1;x[i][2]:=aux; break;
          end;
       end;

  for i := 1 to nmax do
   if x[i][0]=nmax then
    for n1 := 1 to trunc(sqrt(i)) do
     if x[i][0] = nmax then
      for n2 := n1 to trunc(sqrt(i-n1*n1)) do
        begin
          aux:=i-n1*n1-n2*n2;
          if trunc(sqrt(aux))=sqrt(aux) then
          begin
            x[i][0]:=3;x[i][1]:=n1*n1;x[i][2]:=n2*n2;x[i][3]:=aux; break;
          end;
        end
      else break;


  for i := 1 to nmax do
   if x[i][0]=nmax then
    for n1 := 1 to trunc(sqrt(i)) do
    if x[i][0]=nmax then
      for n2 := n1 to trunc(sqrt(i-n1*n1)) do
      if x[i][0]=nmax then
       for n3 := n2 to trunc(sqrt(i-n1*n1-n2*n2)) do
        begin
          aux:=i-n1*n1-n2*n2-n3*n3;
          if trunc(sqrt(aux))=sqrt(aux) then
          begin
            x[i][0]:=4;x[i][1]:=n1*n1;x[i][2]:=n2*n2;x[i][3]:=n3*n3;
            x[i][4]:=aux; break;
          end;
        end
      else break
    else break;
{
    for i := 1 to nmax do
    begin
    write(g,i,' ');
    for j := 1 to x[i][0] do
        write(g,x[i][j],' ');
    writeln(g);

    if x[i][0]=nmax then
        writeln('upsi la ',i);
    end;
}
    assign(f,'operatii.in'); reset(f);

  readln(f,nl,nc);
  for i := 1 to nl do
    for j := 1 to nc do
     begin
       read(f,buf);
       if x[buf][0]>kmx then
         kmx := x[buf][0];
       a[i][j] := buf;
     end;
  close(f);


  writeln(g,kmx);

  for k := 1 to kmx do
      for i := 1 to nl do
      begin
        for j := 1 to nc do
          write(g,trunc(sqrt(x[a[i,j],k])),' ');
        writeln(g)
      end;

  close(g);
end.

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #743 Operatii

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #743 Operatii de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!