Hướng dẫn giải của 29. Tổng bình phương xen kẽ cách quãng (RSUMF5 - * *) tr70


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.

1. Phân tích bài toán

Đề bài yêu cầu tính tổng: ~F(n) = \sum_{i=1}^{n} i \times (i + 3)~ Lấy phần dư cho ~MOD = 10^9 + 7~.

Giới hạn: ~n \le 10^5~. Với giới hạn này, số phép tính tối đa là ~10^5~, hoàn toàn có thể duyệt trực tiếp bằng vòng lặp trong thời gian cho phép (~< 0.1\text{s}~).


2. Phương pháp giải

  • Ý tưởng:
    • Khởi tạo ans = 0.
    • Cho biến i chạy từ 1 đến n.
    • Ở mỗi bước: ans = (ans + i * (i + 3)) % MOD.
  • Độ phức tạp:
    • Thời gian: ~\mathcal{O}(n)~ — rất nhanh, chạy tốt với ~n \le 10^5~.
    • Bộ nhớ: ~\mathcal{O}(1)~.
  • Lưu ý tràn số: Tích ~i \times (i + 3)~ khi ~i = 10^5~ có thể đạt xấp xỉ ~10^{10}~, vượt quá kiểu số nguyên 32-bit (int). Do đó, trong C++ cần dùng kiểu dữ liệu long long.

3. Mã nguồn tham khảo

#include <bits/stdc++.h>
using namespace std;

const long long MOD = 1e9 + 7;

int main() 
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    long long n;
    cin >> n;
    long long ans = 0;
    for (long long i = 1; i <= n; ++i) 
    {
        long long term = (i * (i + 3)) % MOD;
        ans = (ans + term) % MOD;
    }
    cout << ans << endl;
    return 0;
}

Đang tải...