Ai giúp mik câu này vs mik đang cần rất gấp Vote 5 sao và ctlhn Cho dãy a gồm n số nguyên dương a1, a2, …, an và dãy b gồm m số nguyên dương b1, b2, …, bm. Hai dãy a và b được gọi là tương đương nếu tích các phần tử của dãy a bằng tích các phần tử của dãy b. Yêu cầu: Hãy kiểm tra hai dãy a và b cho trước có tương đương hay không. Dữ liệu: Vào từ file văn bản EQUA.INP gồm ba dòng: Dòng đầu ghi hai số nguyên n và m (1 ≤ n, m ≤ 100); Dòng thứ hai ghi n số nguyên dương a1, a2, …, an (1 ≤ ai ≤ 109 ; 1 ≤ i ≤ n); Dòng thứ ba ghi m số nguyên dương b1, b2, …, bm (1 ≤ bi ≤ 109 ; 1 ≤ i ≤ m). Kết quả: Ghi ra file văn bản EQUA.OUT gồm một số nguyên duy nhất: ghi số 1 nếu hai dãy tương đương với nhau, ghi số 0 nếu hai dãy không tương đương với nhau.
1 câu trả lời
const fi = 'EQUA.INP';
fo = 'EQUA.OUT';
var n, m, i: longint;
x, y, res, ans: AnsiString;
function cmp(a,b : AnsiString): longint;
begin
while length(a) < length(b) do a:='0' + a;
while length(b) < length(a) do b:='0' + b;
if a = b then exit(0);
if a > b then exit(1);
exit(-1);
end;
function add(a, b: AnsiString): AnsiString;
var c: AnsiString;
sum, carry, i: longint;
begin
carry:=0; c:='';
while(length(a) < length(b)) do a:='0' + a;
while(length(b) < length(a)) do b:='0' + b;
for i:=length(a) downto 1 do
begin
sum:=ord(a[i]) - 48 + ord(b[i]) - 48 + carry;
carry:=sum div 10;
c:=chr(sum mod 10 + 48) + c;
end;
if(carry > 0) then c:='1' + c;
exit(c);
end;
function sub(a, b: AnsiString): AnsiString;
var ans: AnsiString;
s, borrow, i: Longint;
begin
borrow:=0; ans:='';
while length(a) < length(b) do
a:='0' + a;
while length(b) < length(a) do
b:='0' + b;
for i:=length(a) downto 1 do
begin
s:=ord(a[i]) - ord(b[i]) - borrow;
if s < 0 then
begin
inc(s, 10);
borrow:=1;
end else
borrow:=0;
ans:=chr(s + 48) + ans;
end;
while(length(ans) > 1) and (ans[1] = '0') do
delete(ans, 1, 1);
exit(ans);
end;
function mul(a, b: AnsiString): AnsiString;
var sum, tmp: AnsiString;
m, i, j: longint;
begin
m:=-1; sum:='';
for i:=length(a) downto 1 do
begin
inc(m);
tmp:='';
for j:=1 to ord(a[i]) - 48 do tmp:=add(tmp,b);
for j:=1 to m do tmp:=tmp + '0';
sum:=add(tmp,sum);
end;
exit(sum);
end;
function divv(a, b: AnsiString): AnsiString;
var c, hold: AnsiString;
kb: array[0..10] of AnsiString;
i, k: longint;
begin
kb[0]:='0';
for i:=1 to 10 do
kb[i]:=add(kb[i - 1],b);
hold:=''; c:='';
for i:=1 to length(a) do
begin
hold:=hold + a[i];
k:=1;
while cmp(hold,kb[k]) <> -1 do inc(k);
c:=c+chr(k - 1 + 48);
hold:=sub(hold, kb[k - 1]);
end;
while (length(c) > 1) and (c[1] = '0') do delete(c, 1, 1);
exit(c);
end;
begin
assign(input, fi); reset(input);
assign(output, fo); rewrite(output);
read(n, m); readln;
res:='1';
for i:=1 to n do
begin
readln(x);
res:=mul(res, x);
end;
ans:='1';
for i:=1 to m do
begin
readln(y);
ans:=mul(ans, y);
end;
if(res = ans) then writeln(1) else writeln(0);
close(input); close(output);
end.