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] Biến quy nạp và giảm độ mạnh phép toán trong vòng lặp

    Xét một vòng lặp đơn (không rẽ nhánh, không lồng nhau) với biến điều khiển iii chạy từ 111 đến NNN (bước nhảy 1; nếu N=0N = 0N=0 vòng lặp không chạy lần nào). Thân vòng lặp có mmm biến phụ y1,…,ymy_1,\ldots,y_my1​,…,ym​; biến yky_kyk​ được định nghĩa lại mỗi lần lặp (tại thời điểm iii hiện tại của lần lặp đó) theo công thức tuyến tính: yk=ak⋅i+bky_k = a_k \cdot i + b_kyk​=ak​⋅i+bk​ với ak,bka_k, b_kak​,bk​ là hằng số nguyên cho trước, không đổi trong suốt vòng lặp. Quy ước giá trị "trước vòng lặp" (tại i=0i = 0i=0, khi vòng lặp chưa chạy lần nào) là yk=bky_k = b_kyk​=bk​.

    Yêu cầu:

    1. Phân loại: nếu ak=0a_k = 0ak​=0, yky_kyk​ là bất biến vòng lặp (loop-invariant) — in INVARIANT. Nếu ak≠0a_k \ne 0ak​=0, yky_kyk​ là biến quy nạp (induction variable) — in INDUCTION.
    2. Giá trị cuối cùng: giá trị của yky_kyk​ ngay sau khi vòng lặp kết thúc (sau lần lặp thứ NNN, hoặc giá trị trước vòng lặp nếu N=0N = 0N=0) — tính theo công thức ak⋅N+bka_k \cdot N + b_kak​⋅N+bk​ (công thức này đúng cho mọi N≥0N \ge 0N≥0, kể cả N=0N=0N=0).
    3. Số phép cộng trình biên dịch cần thực hiện khi áp dụng giảm độ mạnh phép toán (strength reduction): thay vì nhân lại ak⋅ia_k \cdot iak​⋅i mỗi lần lặp, khởi tạo yk←bk+aky_k \leftarrow b_k + a_kyk​←bk​+ak​ trước vòng lặp rồi mỗi lần lặp sau chỉ cộng thêm aka_kak​. Biến INVARIANT không cần phép cộng nào (chỉ gán 1 lần bkb_kbk​). Biến INDUCTION cần đúng NNN phép cộng nếu N≥1N \ge 1N≥1, và 000 phép cộng nếu N=0N = 0N=0.

    In ra mmm dòng theo thứ tự k=1,…,mk = 1,\ldots,mk=1,…,m: y{k} INVARIANT gia_tri hoặc y{k} INDUCTION gia_tri. Dòng cuối cùng: ADDS=tong_so_phep_cong (tổng trên tất cả biến INDUCTION).

    Ví dụ

    Input:

    3 3
    0 5
    2 1
    -1 10
    

    Output:

    y1 INVARIANT 5
    y2 INDUCTION 7
    y3 INDUCTION 7
    ADDS=6
    
    • Định dạng đầu vào:

      Dòng đầu: N,mN, mN,m (0≤N≤1090 \le N \le 10^90≤N≤109, 1≤m≤10001 \le m \le 10001≤m≤1000). mmm dòng tiếp theo, mỗi dòng "aka_kak​ bkb_kbk​" (∣ak∣,∣bk∣≤106|a_k|, |b_k| \le 10^6∣ak​∣,∣bk​∣≤106, số nguyên, có thể âm hoặc bằng 0).

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

      In mmm dòng "y{k} INVARIANT val" hoặc "y{k} INDUCTION val" theo thứ tự kkk, rồi dòng cuối "ADDS=tổng".

    Ví dụ:

    Đầu vào:

    3 3
    0 5
    2 1
    -1 10
    

    Đầu ra:

    y1 INVARIANT 5
    y2 INDUCTION 7
    y3 INDUCTION 7
    ADDS=6
    

    Đầu vào:

    0 2
    3 4
    0 7
    

    Đầu ra:

    y1 INDUCTION 4
    y2 INVARIANT 7
    ADDS=0
    

    Đang tải editor...