Hướng dẫn giải của [200 đề thầy Đức] Bài 42: Tính tổng dãy số
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.
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.
Hướng dẫn giải
Cho số nguyên dương N, tính f(N) = -1 + 2 - 3 + ... + N*(-1)^N. Số hạng thứ k có dấu âm nếu k lẻ, dương nếu k chẵn.
Cách làm
Gom các số hạng thành từng cặp liên tiếp:
- Nếu N chẵn: các cặp (-1 + 2), (-3 + 4), ... mỗi cặp bằng 1 và có N/2 cặp. Đáp số là N / 2.
- Nếu N lẻ: có (N - 1)/2 cặp bằng 1 nhưng bị dư số hạng cuối là -N. Khi đó đáp số là (N-1)/2 - N = -(N + 1)/2.
Ví dụ: f(4) = 2 (chẵn, 4/2), f(5) = -3 (lẻ, -(5+1)/2). N có thể tới 10^15 nên phải dùng long long.
#include <bits/stdc++.h>
using namespace std;
int main() {
long long n;
cin >> n;
long long ketqua;
if (n % 2 == 0) {
// N chẵn: các cặp (-1+2), (-3+4), ... mỗi cặp bằng 1, có N/2 cặp
ketqua = n / 2;
} else {
// N lẻ: có (N-1)/2 cặp bằng -1, còn lại số hạng cuối bằng -N
// Kết quả là -(N+1)/2
ketqua = -(n + 1) / 2;
}
cout << ketqua << "\n";
return 0;
}
Bình luận