Hướng dẫn giải của Tính giá trị hàm bậc 2


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, kiengyt, Nozz, Namdo

Editorial for function: Tính giá trị hàm bậc 2

Hiểu bài toán

Bài toán yêu cầu tính giá trị của hàm số bậc hai f(x) = a * x^2 + b * x + c với các giá trị đầu vào a, b, c, x là các số nguyên không âm (0 ≤ x, a, b, c ≤ 10^6). Đây là bài toán đơn giản chỉ cần thực hiện phép tính theo công thức.

Các cách tiếp cận

Cách Direct Computation
#include <stdio.h>

int main() {
    long long a, b, c, x;
    scanf("%lld %lld %lld %lld", &a, &b, &c, &x);
    printf("%lld", a * x * x + b * x + c);
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Đây là cách tiếp cận trực tiếp nhất. Ta khai báo các biến a, b, c, x kiểu long long để đảm bảo không bị tràn số khi tính toán (vì x có thể lên tới 10^6, nên x^2 có thể lên tới 10^12). Sau đó nhập dữ liệu và in ra kết quả tính theo công thức axx + b*x + c.

Cách Functional Approach
#include <stdio.h>

long long f(int a, int b, int c, int x) {
    return 1LL * a * x * x + 1LL * b * x + c;
}

int main() {
    int a, b, c, x;
    scanf("%d %d %d %d", &a, &b, &c, &x);
    printf("%lld", f(a, b, c, x));
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Cách tiếp cận này tách biệt logic tính toán thành một hàm riêng f(). Sử dụng các biến int cho đầu vào nhưng khi nhân trong hàm f() có ép kiểu 1LL (long long) để tránh tràn số. Đây là cách cấu trúc hóa mã nguồn tốt hơn.

Phân tích độ phức tạp

Cách tiếp cận Time Space Tên
1 O(1) O(1) Direct Computation
2 O(1) O(1) Functional Approach

Bài học kinh nghiệm

  • Phép nhân x^2 có thể gây tràn số nếu dùng kiểu int thông thường (x ≤ 10^6 -> x^2 ≤ 10^12, lớn hơn giới hạn của int ~2*10^9)
  • Sử dụng long long là bắt buộc để lưu kết quả cuối cùng

Lỗi thường gặp

  • Dùng kiểu int cho biến kết quả dẫn đến sai số tràn số (overflow)
  • Quên các dấu * trong biểu thức tính toá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.