Hướng dẫn giải của Tổng và Hiệu
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.
Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.
Bạn phải đăng nhập để mở lời giải này.
Đăng nhậpTác giả: , , ,
Editorial for subsum: Tổng và Hiệu
Hiểu bài toán
Cho hai số nguyên A và B. Tìm hai số nguyên X và Y sao cho X + Y = A và X - Y = B. Đảm bảo luôn tồn tại nghiệm nguyên. Để giải bài toán này, ta có thể dùng phương pháp đại số:
- Cộng hai phương trình: (X + Y) + (X - Y) = A + B → 2X = A + B → X = (A + B) / 2.
- Trừ phương trình 2 khỏi phương trình 1: (X + Y) - (X - Y) = A - B → 2Y = A - B → Y = (A - B) / 2. Vì đề bài đảm bảo luôn có nghiệm nguyên, (A + B) và (A - B) đều chẵn, nên phép chia 2 cho kết quả nguyên. Ta chỉ cần tính X và Y theo công thức trên.
Các cách tiếp cận
Cách Công thức trực tiếp
#include <stdio.h>
int main() {
int a, b, x, y;
scanf("%d %d", &a, &b);
x = (a + b) / 2;
y = (a - b) / 2;
printf("%d %d", x, y);
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Sử dụng biến kiểu int để lưu A, B, X, Y. Tính X và Y theo công thức (A+B)/2 và (A-B)/2. Do A, B trong khoảng ±10^9, tổng và hiệu nằm trong ±2×10^9, phù hợp với int (vốn có thể lưu đến khoảng ±2×10^9). Tuy nhiên, cách này có thể tràn số nếu dùng int trên một số nền tảng có int 32-bit ở mức biên. Nên dùng long long để an toàn.
Cách Công thức với long long
#include <stdio.h>
int main() {
long long a, b;
scanf("%lld %lld", &a, &b);
printf("%lld %lld", (a + b) / 2, (a - b) / 2);
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Sử dụng long long để đảm bảo không tràn số khi tính A + B hoặc A - B với A, B lên tới 10^9. In trực tiếp kết quả tính toán mà không cần biến trung gian. Đây là cách ngắn gọn và an toàn.
Cách Công thức với long (Khuyến nghị)
#include <stdio.h>
#include <stdlib.h>
int main() {
long a, b;
scanf("%ld %ld", &a, &b);
printf("%ld %ld", (a + b) / 2, (a - b) / 2);
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Sử dụng long (thường có kích thước 64-bit trên hệ thống 64-bit) để tránh tràn số và vẫn giữ code đơn giản. Nếu dùng long trên hệ thống 32-bit, nó vẫn có thể tràn số, do đó long long là lựa chọn an toàn nhất.
Phân tích độ phức tạp
| Cách tiếp cận | Time | Space | Tên |
|---|---|---|---|
| 1 | O(1) | O(1) | Công thức trực tiếp |
| 2 | O(1) | O(1) | Công thức với long long |
| 3 | O(1) | O(1) | Công thức với long (Khuyến nghị) |
Bài học kinh nghiệm
- Giải hệ phương trình tuyến tính 2 ẩn bằng cách cộng và trừ hai phương trình để tìm X và Y.
- Nên dùng kiểu dữ liệu 64-bit (long long) để tránh tràn số khi A, B nằm ở biên ±10^9.
Lỗi thường gặp
- Sử dụng int có thể gây tràn số khi tính A + B hoặc A - B nếu A, B gần 10^9.
- Quên kiểm tra dấu chia (phép chia số nguyên trong C/C++ làm tròn về 0, nhưng ở đây cả (A+B) và (A-B) đều chẵn nên kết quả luôn nguyên).
Bình luận