题解 | 循环求和
循环求和
https://www.nowcoder.com/practice/f1725df80ee04cfebb6300f27c3d6464
- 关键发现:奇数保持为正数偶数变为负数需要计算区间 [l,r] 内所有数的和
- 解题策略:分别计算奇数和偶数的贡献奇数的和可以用等差数列公式偶数的和也可以用等差数列公式,但要取负
- 具体步骤:计算区间内奇数的个数和和计算区间内偶数的个数和和偶数和取负后与奇数和相加
#include <bits/stdc++.h> using namespace std; // 计算区间[l,r]内的答案 long long solve(long long l, long long r) { long long sum = 0; // 处理奇数 long long first_odd = (l % 2 == 0) ? l + 1 : l; long long last_odd = (r % 2 == 0) ? r - 1 : r; if(first_odd <= last_odd) { // 先除以2再乘以n,避免溢出 sum += ((last_odd + first_odd) / 2) * ((last_odd - first_odd) / 2 + 1); } // 处理偶数 long long first_even = (l % 2 == 0) ? l : l + 1; long long last_even = (r % 2 == 0) ? r : r - 1; if(first_even <= last_even) { // 先除以2再乘以n,避免溢出 sum -= ((last_even + first_even) / 2) * ((last_even - first_even) / 2 + 1); } return sum; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while(T--) { long long l, r; cin >> l >> r; cout << solve(l, r) << '\n'; } return 0; }#牛客春招刷题训练营#