Hướng dẫn giải của Tính tổng


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, hongthu712, dominhhieu2006123, congtyluuthaibao1978

Hiểu bài toán

Xét dãy số Tn được định nghĩa bởi công thức Tn = n^2 - (n-1)^2. Yêu cầu tính tổng S = T1 + T2 + ... + T_n với n là số nguyên dương (1 ≤ n ≤ 10^6). Ta cần tìm giá trị S cho trước n.

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

Cách Vòng lặp (Brute Force)
#include <stdio.h>
int main()
{
    long long int n, T = 0;
    scanf("%lld", &n);
    for (long long int i = 1; i <= n; i++)
    {
        T = T + 2*i - 1;
    }
    printf("%lld",T);
}
  • Time Complexity: O(n)
  • Space Complexity: O(1)

Phương pháp này mô phỏng lại quá trình tính tổng các số hạng. Biến đổi T_n = n^2 - (n-1)^2 = n^2 - (n^2 - 2n + 1) = 2n - 1. Do đó, tổng S = Σ(2i - 1) từ i = 1 đến n. Code sử dụng vòng lặp for để lặp từ 1 đến n, mỗi lần lặp cộng dồn giá trị (2*i - 1) vào biến T. Với n lên tới 10^6, số lượng thao tác là khoảng 10^6, hoàn toàn chấp nhận được trong thời gian chạy.

Cách Công thức toán học (Optimal)
#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    long long n;
    cin >> n;
    long long S = n * n;
    cout << S;
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Đây là phương pháp hiệu quả nhất. Ta có tổng S = Σ(2i - 1) từ i = 1 đến n. Đây là tổng của n số hạng là các số lẻ liên tiếp bắt đầu từ 1. Một tính chất quan trọng của dãy số lẻ là tổng của n số lẻ đầu tiên bằng bình phương của n đó, tức là 1 + 3 + 5 + ... + (2n-1) = n^2. Do đó, kết quả chỉ cần tính n * n. Phương pháp này bỏ qua vòng lặp và tính kết quả ngay lập tức, phù hợp với mọi giá trị n (kể cả n rất lớn).

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

Cách tiếp cận Time Space Tên
1 O(n) O(1) Vòng lặp (Brute Force)
2 O(1) O(1) Công thức toán học (Optimal)

Bài học kinh nghiệm

  • Phép biến đổi Tn = n^2 - (n-1)^2 = 2n - 1 cho thấy Tn là một số lẻ.
  • Tổng S là tổng của n số lẻ đầu tiên, bằng n^2.
  • Với n ≤ 10^6, kết quả n^2 có thể lên tới 10^12, nên cần sử dụng kiểu dữ liệu 64-bit (long long) để tránh tràn số.

Lỗi thường gặp

  • Sử dụng kiểu dữ liệu int (32-bit) dẫn đến tràn số (overflow) khi n lớn (ví dụ n = 10^6 thì n^2 = 10^12 > 2^31 - 1).
  • Viết sai công thức T_n (ví dụ nhầm dấu trừ) dẫn đến vòng lặp tính sai.

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.