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.

Câu hỏi trong lớp Xem thêm