GESP / CSP-J入门讲解:题目的 题意分析 + C++题解

GESP / CSP-J入门讲解:题目的 题意分析 + C++题解


一、题目1

B4356 数三角形

题目:
👉 https://www.luogu.com.cn/problem/B4356

题意

给定整数 (n),直角三角形两条直角边为 (a,b)。

要求:

  • (1 \le a,b \le n)
  • 三角形面积为整数
  • 相同三角形只算一次(即 (a,b) 与 (b,a) 视为同一个)

面积公式:

[
S = \frac{ab}{2}
]

要使面积为整数:

[
ab \text{ 必须是偶数}
]

即:

a 或 b 至少一个为偶数。 (luogu.store)

同时为了避免重复:

[
a \le b
]


解法1(GESP二级标准:枚举)

思路

枚举:

1 ≤ a ≤ b ≤ n

判断:

(a * b) % 2 == 0

即可。

时间复杂度

[
O(n^2)
]


C++代码(循环版)

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

int main()
{
    int n;
    cin >> n;

    long long ans = 0;

    for (int a = 1; a <= n; a++)
    {
        for (int b = a; b <= n; b++)
        {
            if ((a * b) % 2 == 0)
                ans++;
        }
    }

    cout << ans << endl;

    return 0;
}

二、题目2

B3840 找素数

题目:
👉 https://www.luogu.com.cn/problem/B3840


题意

输入两个整数:

A B

统计区间:

[A,B]

有多少个 素数

素数定义:

大于1且只有1和自身两个因数的整数。 (luogu.com.cn)

例如:

2 10

素数:

2 3 5 7

答案:

4

解题思路

遍历:

i = A → B

判断:

i 是否为素数

判断素数优化

只需要检查:

[
2 \le i \le \sqrt{n}
]

因为:

如果

[
a \times b = n
]

必有

[
a \le \sqrt{n}
]


C++代码

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

bool isPrime(int x)
{
    if (x < 2) return false;

    for (int i = 2; i * i <= x; i++)
    {
        if (x % i == 0)
            return false;
    }

    return true;
}

int main()
{
    int A, B;
    cin >> A >> B;

    int cnt = 0;

    for (int i = A; i <= B; i++)
    {
        if (isPrime(i))
            cnt++;
    }

    cout << cnt << endl;

    return 0;
}

复杂度

判断一个数:

O(√n)

整体:

O((B-A)√B)

由于

B ≤ 1000

所以非常快。


GESP考试知识点总结

题目 知识点
B4356 枚举、数学计数、奇偶性
B3840 素数判断、循环、函数
难度 GESP二级

如果是 GESP/CSP教学,这两题背后的核心模板其实是

① 奇偶性判断模板

if ((a * b) % 2 == 0)

② 素数判断模板

bool isPrime(int x){
    if(x<2) return false;
    for(int i=2;i*i<=x;i++)
        if(x%i==0) return false;
    return true;
}

非常适合 GESP备考训练

posted @ 2026-03-11 09:19  kkman2000  阅读(78)  评论(0)    收藏  举报