Hướng dẫn giải của Tổng và Hiệu


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
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ập

Tác giả: Hiếu Nguyễn, 1000dayslearningcode, nquang2909, Khang2007

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

Please read the guidelines before commenting.


Không có bình luận tại thời điểm này.