Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Mô phỏng máy ngăn xếp định giá modulo nguyên tố

    Trong sinh mã trung gian (intermediate code generation), một biểu thức hậu tố thường được thực thi bởi một máy ngăn xếp ảo (stack machine) với các lệnh PUSH (đẩy 1 giá trị) và POP (lấy 1 giá trị). Bài này yêu cầu vừa định giá biểu thức vừa đếm số lệnh của máy ảo, với phép tính được thực hiện trong số học modulo một số nguyên tố ppp (để tránh tràn số và để phép chia luôn có kết quả xác định thông qua nghịch đảo modulo).

    Cho một biểu thức hậu tố mà toán hạng là các biến chữ cái thường (a-z, có thể xuất hiện lặp lại), toán tử hai ngôi thuộc {+,−,×,÷}\{+,-,\times,\div\}{+,−,×,÷} (+ - * /). Cho trước một số nguyên tố ppp và giá trị (đã rút gọn modulo ppp, trong khoảng [0,p−1][0, p-1][0,p−1]) của từng biến xuất hiện trong biểu thức. Phép chia ÷\div÷ được định nghĩa là nhân với nghịch đảo modulo ppp của toán hạng bên phải, tính theo định lý Fermat nhỏ: b−1≡bp−2(modp)b^{-1} \equiv b^{p-2} \pmod pb−1≡bp−2(modp) (đề bảo đảm toán hạng chia luôn khác 0 mod p0 \bmod p0modp).

    Máy ảo hoạt động như sau: gặp toán hạng, thực hiện 1 lệnh PUSH giá trị (đã rút gọn modulo ppp) của biến đó vào ngăn xếp; gặp toán tử, thực hiện 2 lệnh POP để lấy ra hai giá trị trên cùng (giá trị pop trước là toán hạng bên phải), tính kết quả modulo ppp rồi thực hiện 1 lệnh PUSH kết quả đó.

    Hãy in ra giá trị cuối cùng của biểu thức modulo ppp (một số trong [0,p−1][0,p-1][0,p−1]), tổng số lệnh PUSH và tổng số lệnh POP đã thực hiện.

    Ví dụ: với p=7p=7p=7, biểu thức a b +, a=3,b=5a=3, b=5a=3,b=5: kết quả =(3+5) mod 7=1= (3+5) \bmod 7 = 1=(3+5)mod7=1; số lệnh PUSH =3=3=3 (đẩy aaa, đẩy bbb, đẩy kết quả), số lệnh POP =2=2=2.

    • Định dạng đầu vào:

      Dòng 1: số nguyên tố ppp. Dòng 2: biểu thức hậu tố, các token cách nhau đúng một khoảng trắng. Dòng 3: số nguyên kkk — số biến phân biệt được cho giá trị. kkk dòng tiếp theo, mỗi dòng gồm tên biến (một chữ cái) và giá trị nguyên của biến đó (đã thuộc [0,p−1][0,p-1][0,p−1]), cách nhau một khoảng trắng.

    • Định dạng đầu ra:

      Một dòng gồm ba số nguyên cách nhau một khoảng trắng: giá trị biểu thức modulo ppp, tổng số lệnh PUSH, tổng số lệnh POP.

    Ví dụ:

    Đầu vào:

    1000000007
    x
    1
    x 999999999

    Đầu ra:

    999999999 1 0
    

    Đầu vào:

    7
    a b +
    2
    a 3
    b 5

    Đầu ra:

    1 3 2
    

    Đang tải editor...