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 a
2
sau b
2
.
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: b
1
, b
2
, …, b
k
cu număr minim de termeni (k
minim), cu proprietatea că a
=b
1
2
+b
2
2
...+b
k
2
.
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 b
1
, b
2
, …, b
k
. 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 tablouluia
mai mici sau cel mult egale cu100
şim,n≤ 100
.60%
din teste au componentele tablouluia
mai mici sau cel mult egale cu1000
.
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 .
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!