Calexp (Tin học trẻ toàn quốc 2024 – Vòng sơ khảo – Bảng B)
Đề bài
Cho biểu thức
$$A = x^2 + y^2 + x \times y.$$
Biết giá trị của hai số nguyên $x$ và $y$, em hãy tính giá trị của $A$.
Dữ liệu vào:
- Dòng thứ nhất: số nguyên $X$ ($0 \le X \le 100$) – giá trị của $x$;
- Dòng thứ hai: số nguyên $Y$ ($0 \le Y \le 100$) – giá trị của $y$.
Kết quả: in ra một số nguyên duy nhất là giá trị của $A$.
Giới hạn thời gian: 1 giây. Dữ liệu nhập từ bàn phím, in ra màn hình.
1
27Giải thích: $x = 1$, $y = 2$ nên $A = 1^2 + 2^2 + 1 \times 2 = 1 + 4 + 2 = 7$.
Lời mở đầu
Đây là bài "khởi động" của đề sơ khảo Bảng B Tin học trẻ 2024: đọc hai số, thay vào công thức và in kết quả. Bài dễ nhưng vẫn có vài điểm các em mới học hay vấp: đọc dữ liệu nằm trên hai dòng, viết $x^2$ trong C++ thế nào (đừng viết x^2!), và có bị tràn số không. Mình đi lần lượt từng ý, kèm một hình vẽ nhỏ để thấy biểu thức này "trông như thế nào".
Link này chỉ học viên đã tham gia tổ chức mới vào được. Học viên nên ưu tiên nộp ở đây vì sẽ được chấm nhanh hơn.
Nộp bài trên CLUE OJLộ trình lời giải, bấm vào từng phần để nhảy tới:
Bộ testBộ test có gì?
Bộ test trên CLUE do mình tự sinh theo đúng giới hạn của đề: 20 test, test 1 là ví dụ của đề. Đề không chia subtask (cả bài là một nhóm 100%).
| Nhóm test | Test | Nội dung |
|---|---|---|
| Ví dụ của đề | 1 | $x = 1, y = 2$, đáp án $7$ |
| Biên | 2–10 | $x = y = 0$ (đáp án $0$), $x = y = 100$ (đáp án lớn nhất $30000$), một số bằng $0$, hai số bằng nhau, $99$ và $100$… |
| Ngẫu nhiên | 11–20 | $x, y$ ngẫu nhiên trong đoạn $[0, 100]$ |
Có 5 test có ít nhất một số bằng $0$ (test 2, 4–5, 7, 10), trong đó test 2 cả hai số đều bằng $0$. Đáp án lớn nhất là $30.000$ (test 3, $x = y = 100$).
| Subtask | Điều kiện | Test | Cách làm C++ | Cách làm Python |
|---|---|---|---|---|
| Duy nhất (100%) | $0 \le X, Y \le 100$ | 1–20 | 20/20 | 20/20 |
Ý tưởngBiểu thức nhìn bằng hình vuông
Cách làm thì chỉ là thay số vào công thức. Nhưng có một cách nhìn rất đẹp: vẽ hình vuông cạnh $x + y$. Diện tích của nó là $(x + y)^2 = x^2 + y^2 + 2xy$ – gồm hình vuông $x \times x$, hình vuông $y \times y$ và hai hình chữ nhật $x \times y$. Biểu thức $A$ chỉ lấy một hình chữ nhật, nên
$$A = x^2 + y^2 + xy = (x + y)^2 - xy.$$
Em nhập $x, y$ nhỏ (không quá 12) rồi bấm Tiếp để đếm từng phần (mỗi ô vuông nhỏ là $1$ đơn vị diện tích):
Với ví dụ $x = 1, y = 2$: $(1 + 2)^2 - 1 \cdot 2 = 9 - 2 = 7$ – đúng như đáp án. Công thức $(x+y)^2 - xy$ chỉ là để hiểu thêm; trong code mình tính thẳng theo đề cho dễ đọc.
Lời giảiTính thẳng theo công thức – O(1)
Vài lưu ý khi viết code:
- Bình phương: trong C++ và Python,
x^2là phép XOR bit chứ không phải lũy thừa! Hãy viếtx * x. (Python cóx ** 2; C++ cópow(x, 2)nhưng hàm này trả về số thựcdouble– không nên dùng cho số nguyên.) - Hai dòng:
cin >> x >> yđọc được cả khi hai số nằm trên hai dòng (C++ bỏ qua dấu xuống dòng). Trong Python thì mỗi lệnhinput()đọc một dòng, nên gọi hai lần. - Tràn số: lớn nhất $A = 100^2 + 100^2 + 100 \cdot 100$ $= 30000$ – kiểu
intlà đủ. Mình vẫn dùnglong longtheo thói quen an toàn, không tốn gì cả.
Kết quả chạy thật: Bản C++ đúng 20/20 test, chạy lâu nhất 0.003s. Bản Python đúng 20/20 test, chạy lâu nhất 0.021s.
Tổng kếtKết quả chạy thật trên bộ test
| Cách | Ngôn ngữ | Đúng | Lâu nhất (test đúng) | Điểm theo subtask |
|---|---|---|---|---|
| Tính thẳng theo công thức | C++ | 20/20 | 0.003s | 100% |
| Python | 20/20 | 0.021s | 100% |
x * x, không dùng ^; (2) luôn ước lượng giá trị lớn nhất của đáp án để chọn kiểu dữ liệu; (3) thử lại với các trường hợp biên như $x = y = 0$ và $x = y = 100$ trước khi nộp.
Nhận xét
Đăng nhận xét