五级
C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【GESP】C++五级真题(数论、埃氏筛思想考点) luogu-B3969 [GESP202403 五级] B-smooth 数
📅 2025-10-30·✍️ OneCoder·计算中...·⏱️ 5 分钟
#GESP#C++#数论
GESP C++ 2024年3月五级真题,数论、埃氏筛思想考点,难度⭐⭐★☆☆,属于五级真题中比较简单的。洛谷难度等级普及−
luogu-B3969 [GESP202403 五级] B-smooth 数
题目要求
题目描述
小杨同学想寻找一种名为 -smooth 数的正整数。
如果一个正整数的最大质因子不超过 ,则该正整数为 -smooth 数。小杨同学想知道,对于给定的 和 ,有多少个不超过 的 -smooth 数。
输入格式
第一行包含两个正整数 和 ,含义如题面所示。
输出格式
输出一个非负整数,表示不超过 的 -smooth 数的数量。
输入输出样例 #1
输入 #1
PLAINTEXT
10 3
输出 #1
PLAINTEXT
7
说明/提示
数据规模与约定
| 子任务 | 得分 | ||
|---|---|---|---|
对全部的测试数据,保证 。
题目分析
解题思路
核心思想:先筛出所有 的质数,再用“埃氏筛”思想把这些质数的倍数全部标记为 -smooth,最后统计标记个数。
- 先线性筛出所有 的质数,得到“允许质因子”集合。
- 用埃氏筛思想:把上述质数的所有倍数都标记为 -smooth。
- 若某数被 的质数整除,则其最大质因子必 ,故撤销该数的 -smooth 标记。
- 最后统计被标记的个数,并额外加上 (因为 恒为 -smooth)。
示例代码
CPP
#include <iostream>
// 标记数组:nums[i]=1 表示 i 是 B-smooth 数,反之不是
int nums[1000005];
// 判断 x 是否为质数
bool is_prime(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 n, B;
std::cin >> n >> B;
int count = 0; // 当前 B-smooth 数个数
for (int i = 2; i <= n; ++i) {
if (i <= B && is_prime(i)) {
// i 是 ≤B 的质数,将其倍数全部标记为 B-smooth
for (int j = i; j <= n; j += i) {
if (nums[j] == 0) { // 首次被标记
nums[j] = 1;
count++;
}
}
}
if (i > B && is_prime(i)) {
// i 是 >B 的质数,其倍数都不再是 B-smooth,撤销标记
for (int j = i; j <= n; j += i) {
if (nums[j] == 1) { // 之前被标记过
nums[j] = 0;
count--;
}
}
}
}
// 1 恒为 B-smooth,故结果 +1
std::cout << count + 1 << std::endl;
return 0;
}
💡 OneCoder 资源指引
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
🤝 技术交流与答疑
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
📚
猜你想读 · 相关文章推荐
GESP 编程与算法 · 五级⏱️ 6 分钟
【GESP】C++五级练习(初等数论考点) luogu-B3941 [GESP样题 五级] 小杨的锻炼
GESP C++ 五级初等数论考点练习,难度⭐⭐★☆☆。洛谷难度等级普及−
阅读全文 →
GESP 编程与算法 · 五级⏱️ 7 分钟
【GESP】C++五级(四级也可)练习(四级排序考点) luogu-B3951 [GESP样题 五级] 小杨的队列
GESP C++ 五级练习,但是核心的考点是四级排序内容,因为是GESP五级样例,所以归类在五级练习之中,其实四级同学完全可以练习,难度⭐⭐★☆☆。洛谷难度等级普及−
阅读全文 →
GESP 编程与算法 · 五级⏱️ 9 分钟
【GESP】C++五级真题(数论考点) luogu-B3871 [GESP202309 五级] 因数分解
GESP C++ 2023年9月五级真题,数论考点,难度⭐⭐★☆☆。洛谷难度等级普及−
阅读全文 →
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com
💬 读者留言与交流
还没有留言,快来成为第一个讨论者吧!