数值积分

找到区间内第一个偶数坐标,按步长 2 枚举函数值并乘以坐标间距。

OJ: shumeng

题目 ID: CSP202503A

难度:入门

标签:模拟数学

日期: 2026-07-31 16:21

形式化题目

给定二次函数 f(x)=x2+bx+cf(x)=x^2+bx+c 和整数区间 [l,r][l,r],令

s=2×x 为 [l,r] 中偶数f(x), s=2 \times \sum_{x \text{ 为 } [l,r] \text{ 中偶数}} f(x),

求整数 ss

思路

直接按题意模拟采样过程,分两步完成。

确定第一个采样点

采样点的横坐标必须是偶数。若 ll 是偶数就从 ll 开始,否则从 l+1l+1 开始,即先找到区间内第一个偶数 firstfirst

以步长 2 累加

firstfirst 开始每次加 22,枚举所有偶数坐标点,累加函数值 x2+bx+cx^2+bx+c。题目保证 0l<l+2r10000 \le l < l+2 \le r \le 1000,点数很少,直接循环即可。最后把累加结果乘以采样间距 22 输出。

代码

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-31 16:21
 * update_at: 2026-08-17 22:46
 */
#include <bits/stdc++.h>
using namespace std;

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

    long long b, c, l, r;
    cin >> b >> c >> l >> r;

    // 找到区间内第一个偶数坐标作为采样起点
    long long first = l;
    if (first % 2 != 0) first++;

    // 以步长 2 枚举所有偶数坐标点,累加对应函数值
    long long answer = 0;
    for (long long x = first; x <= r; x += 2) {
        answer += x * x + b * x + c;
    }
    // 估算积分等于函数值之和乘以采样间距 2
    cout << answer * 2 << '\n';

    return 0;
}

复杂度

设区间内偶数点数量为 kk,时间复杂度为 O(k)O(k),空间复杂度为 O(1)O(1)

总结

本题的关键是正确处理第一个偶数采样点,以及相邻采样点之间步长为 22。用一个 %2 判断起点,再用循环步长 22,就能完整覆盖所有偶数坐标点。