若一个正整数 𝑥 可以被表示为 𝑝 2 ∗ 𝑞 2 ,其中 、 𝑝 、 𝑞 为质数且 𝑝 不等于 𝑞 ,则 𝑥 是一个 “双子数”。 请计算区间 [ 𝑎 , 𝑏 ] 内有多少个 “双子数”? 输入 读入两个整数 𝑎 , 𝑏 ( 1 <= 𝑎 <= 𝑏 <= 10 14 ) 。 输出 一个整数表示答案。 样例输入 复制 100 10000 样例输出 复制 29
我们先分析一下题意。 一个正整数 \( x \) 是“双子数”的定义是: \[ x = p^2 \times q^2 \] 其中 \( p, q \) 为质数,且 \( p \neq q \)。 那么: \[ x = (p \times q)^2 \] 令 \( m = p \times q \),则 \( m \) 是两个不同质数的乘积,且 \( x = m^2 \)。 所以问题转化为: 在区间 \([a, b]\) 中,有多少个数 \( x \) 可以写成 \( m^2 \),其中 \( m \) 是两个不同质数的乘积。 --- 1. 确定 \( m \) 的范围 因为 \( x = m^2 \),且 \( a \le x \le b \),所以: \[ \sqrt{a} \le m \le \sqrt{b} \] 并且 \( m \) 必须是两个不同质数的乘积,即 \( m = p \times q \),\( p < q \) 均为质数。 --- 2. 枚举质数对 设 \( p < q \),那么: \[ p \times q \le \sqrt{b} \] 并且 \( p \times q \ge \sqrt{a} \)。 由于 \( b \le 10^{14} \),所以 \( \sqrt{b} \le 10^7 \)。 因此我们可以用筛法得到 \( \sqrt{b} \) 以内的所有质数。 --- 3. 算法步骤 1. 用埃氏筛或欧拉筛得到 \( \lfloor \sqrt{b} \rfloor \) 以内的所有质数,存在数组 `primes` 中。 2. 遍历所有质数对 \( (p, q) \),满足 \( p < q \) 且 \( p \times q \le \sqrt{b} \)。 3. 计算 \( m = p \times q \),再计算 \( x = m^2 \)。 4. 如果 \( a \le x \le b \),则计数加一。 5. 输出总数。 --- 4. 复杂度分析 质数个数:\( \pi(10^7) \approx 664579 \) 个。 如果直接双重循环 \( p, q \) 会超时,因为 \( O(\pi(n)^2) \) 太大。 需要优化: - 固定 \( p \),则 \( q \) 的范围是大于 \( p \) 且 \( p \times q \le \sqrt{b} \),即 \( q \le \frac{\sqrt{b}}{p} \)。 - 对于每个 \( p \),在 `primes` 中二分查找满足条件的最大 \( q \),然后统计 \( q \) 的个数。 这样复杂度是 \( O(\pi(\sqrt{b}) \times \log \pi(\sqrt{b})) \),可以接受。 --- 5. 代码实现(C++) ```cpp #include <iostream> #include <vector> #include <cmath> #include <algorithm> using namespace std; vector<int> get_primes(int limit) { vector<bool> is_prime(limit + 1, true); vector<int> primes; is_prime[0] = is_prime[1] = false; for (int i = 2; i <= limit; ++i) { if (is_prime[i]) { primes.push_back(i); if ((long long)i * i <= limit) { for (int j = i * i; j <= limit; j += i) { is_prime[j] = false; } } } } return primes; } int main() { long long a, b; cin >> a >> b; long long sqrt_b = sqrt(b); vector<int> primes = get_primes(sqrt_b); int cnt = 0; int n = primes.size(); for (int i = 0; i < n; ++i) { long long p = primes[i]; // 最小的 q 是 primes[i+1] // 需要 p * q <= sqrt_b long long max_q = sqrt_b / p; if (max_q < p) break; // 因为 q > p,如果 max_q < p 则没有符合条件的 q // 二分找到 primes 中第一个大于 max_q 的位置 int left = i + 1, right = n - 1, pos = -1; while (left <= right) { int mid = (left + right) / 2; if (primes[mid] <= max_q) { pos = mid; left = mid + 1; } else { right = mid - 1; } } if (pos != -1) { // 对于每个 q = primes[j],检查 m = p * q,x = m^2 是否在 [a, b] 内 for (int j = i + 1; j <= pos; ++j) { long long q = primes[j]; long long m = p * q; if (m > sqrt_b) break; // 其实不会,因为 q <= max_q long long x = m * m; if (x >= a && x <= b) { cnt++; } } } } cout << cnt << endl; return 0; } ``` --- 6. 样例验证 输入: ``` 100 10000 ``` 输出: ``` 29 ``` 与题目样例一致。 --- 这样我们就得到了一个能在 \( b \le 10^{14} \) 范围内高效计算双子数个数的算法。 [2026-01-18 12:45:24 | AI问答 | 1234点数解答]
- [字节豆包] 题目描述 给定一个正整数 x x,以及另外的 n n 个正整数,请你编写程序,计算 n n 个正整数中,小于 x x 的数的总和是多少? 输入格式 共两行, 第一行依次为 x x 和 n n,数之间以一个空格间隔, 第二行依次为 n n 个正整数,数之间以一个空格间隔。 输出格式 输出一个正整数,即 n n 个数中小于 x x 的数的和。 input1 复制 10 5 1 2 3 11 10 output1 复制 6 input2 复制 29 7 9 17 35 42 28 11 2 output2 复制 67 数据规模与约定 对于 100 % 100% 的数据: 1 ≤ x ≤ 10000 1≤x≤10000, 1 ≤ n ≤ 100 1≤n≤100, 1 ≤ 1≤ 每个正整数 ≤ 10000 ≤10000。(233点数解答 | 2025-08-02 21:35:03)266
- [字节豆包] 题目描述 给定一个正整数 x x,以及另外的 n n 个正整数,请你编写程序,计算 n n 个正整数中,小于 x x 的数的总和是多少? 输入格式 共两行, 第一行依次为 x x 和 n n,数之间以一个空格间隔, 第二行依次为 n n 个正整数,数之间以一个空格间隔。 输出格式 输出一个正整数,即 n n 个数中小于 x x 的数的和。 input1 复制 10 5 1 2 3 11 10 output1 复制 6 input2 复制 29 7 9 17 35 42 28 11 2 output2 复制 67 数据规模与约定 对于 100 % 100% 的数据: 1 ≤ x ≤ 10000 1≤x≤10000, 1 ≤ n ≤ 100 1≤n≤100, 1 ≤ 1≤ 每个正整数 ≤ 10000 ≤10000。 语言方向:C++(255点数解答 | 2025-08-02 21:35:27)182
- [字节豆包] 题目描述 给定 n n 个正整数,再给定一个正整数 x x,请你编写程序,计算 n n 个正整数中,小于 x x 的数的总和是多少? !!!注意输入顺序!!! 输入格式 共三行, 第一行为一个正整数 n n,表示正整数的个数, 第二行依次为 n n 个正整数,数之间以一个空格间隔, 第三行为一个正整数 x x 。 输出格式 输出一个正整数,即 n n 个数中小于 x x 的数的和。 input1 复制 5 1 2 3 11 10 10 output1 复制 6 input2 复制 7 9 17 35 42 28 11 2 29 output2 复制 67 数据规模与约定 对于 100 % 100% 的数据: 1 ≤ n ≤ 100 1≤n≤100, 1 ≤ 1≤ 每个正整数 ≤ 10000 ≤10000, 1 ≤ x ≤ 10000 1≤x≤10000。 语言方向:C++(341点数解答 | 2025-08-02 21:52:19)219
- [GPT] 某班级共有45位同学,分别叫做“第i位学生”(i取值为1至45),每位学生有4次成绩,分别是期中考试成绩,期末考试成绩,平时成绩和作业成绩。假设期中成绩分布在[80,98]区间,期末成绩分布在[40,100]区间,平时成绩分布在[85,97]区间,作业成绩分布在[88,100]区间。通过调用random模块给每位同学录入对应的四次成绩。 定义一个名为cheng_ji的函数,不接收任何参数。按照第1位学生,第2位学生,…,第45位学生的顺序,将学生名字、期中考试成绩、期末考试成绩、平时成绩和作业成绩用return语句依次输出。调用该函数时,函数值显示结果如下: ([],[],[],[],[])(477点数解答 | 2024-12-17 17:00:35)327
- [字节豆包] 某班级共有45位同学,分别叫做“第i位学生”(i取值为1至45),每位学生有4次成绩,分别是期中考试成绩,期末考试成绩,平时成绩和作业成绩。假设期中成绩分布在[80,98]区间,期末成绩分布在[40,100]区间,平时成绩分布在[85,97]区间,作业成绩分布在[88,100]区间。通过调用random模块给每位同学录入对应的四次成绩。 定义一个名为cheng_ji的函数,不接收任何参数。按照第1位学生,第2位学生,...,第45位学生的顺序,将期中考试成绩,期末考试成绩,平时成绩和作业成绩用return语句输出。 实践内容2:统计总评成绩 将本班45位同学的成绩按照如下比例统计出总评成绩:期中考试成绩占30%,期末考试成绩占40%,平时成绩占10%,作业成绩占20%。 定义一个名为zong_ping的函数,不接收任何参数,用return语句输出该班同学的总评成绩(结果取整),按照第1位学生,第2位学生,…,第45位学生的顺序。 输出结果举例:([86,58,…89])。 实践内容3:统计最高分,最低分和平均成绩 统计本班45位同学总评成绩中的最低分,最高分和平均成绩。 定义一个名为san_fen的函数,不接收任何参数,用return语句输出最低分,最高分,和平均分(均取整)。 输出格式如下: (第34位学生,58,第26位学生,93,78)(579点数解答 | 2024-12-21 11:55:01)213
- [GPT] 某班级共有45位同学,分别叫做“第i位学生”(i取值为1至45),每位学生有4次成绩,分别是期中考试成绩,期末考试成绩,平时成绩和作业成绩。假设期中成绩分布在[80,98]区间,期末成绩分布在[40,100]区间,平时成绩分布在[85,97]区间,作业成绩分布在[88,100]区间。通过调用random模块给每位同学录入对应的四次成绩。 定义一个名为cheng_ji的函数,不接收任何参数。按照第1位学生,第2位学生,…,第45位学生的顺序,将学生名字、期中考试成绩、期末考试成绩、平时成绩和作业成绩用return语句依次输出。调用该函数时,函数值显示结果如下: ([],[],[],[],[]),语言方向:Python(441点数解答 | 2024-12-21 21:02:22)228
- [字节豆包] 某班级共有45位同学,分别叫做“第i位学生”(i取值为1至45),每位学生有4次成绩,分别是期中考试成绩,期末考试成绩,平时成绩和作业成绩。假设期中成绩分布在[80,98]区间,期末成绩分布在[40,100]区间,平时成绩分布在[85,97]区间,作业成绩分布在[88,100]区间。通过调用random模块给每位同学录入对应的四次成绩。 定义一个名为cheng_ji的函数,不接收任何参数。按照第1位学生,第2位学生,...,第45位学生的顺序,将期中考试成绩,期末考试成绩,平时成绩和作业成绩用return语句输出。 实践内容2:统计总评成绩 将本班45位同学的成绩按照如下比例统计出总评成绩:期中考试成绩占30%,期末考试成绩占40%,平时成绩占10%,作业成绩占20%。 定义一个名为zong_ping的函数,不接收任何参数,用return语句输出该班同学的总评成绩(结果取整),按照第1位学生,第2位学生,…,第45位学生的顺序。 输出结果举例:([86,58,…89])。 实践内容3:统计最高分,最低分和平均成绩 统计本班45位同学总评成绩中的最低分,最高分和平均成绩。 定义一个名为san_fen的函数,不接收任何参数,用return语句输出最低分,最高分,和平均分(均取整)。 输出格式如下: (第34位学生,58,第26位学生,93,78) import random def cheng_ji(): def zong_ping(): def san_fen(): qi_mo = [] qi_zhong = [] ping_shi = [] zuo_ye = [] zongping = [] xue_sheng = [] for i in range(45):(688点数解答 | 2024-12-22 10:14:17)217
- [DeepSeek] 若一个正整数 𝑥 可以被表示为 𝑝 2 ∗ 𝑞 2 ,其中 、 𝑝 、 𝑞 为质数且 𝑝 不等于 𝑞 ,则 𝑥 是一个 “双子数”。 请计算区间 [ 𝑎 , 𝑏 ] 内有多少个 “双子数”? 输入 读入两个整数 𝑎 , 𝑏 ( 1 <= 𝑎 <= 𝑏 <= 10 14 ) 。 输出 一个整数表示答案。 样例输入 复制 100 10000 样例输出 复制 29(1234点数解答 | 2026-01-18 12:45:24)13
- [字节豆包] 请你补全代码,把数组a的所有元素都赋值为100。 输入: 无 输出: 共二十行,每行一个整数,为数组中的每个数。 输入样例: 无 输出样例: 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100#include <iostream> using namespace std; int main() { int a[20]; for ( ) { } for (int i = 0; i < 20; i++) { cout << a[i] << endl; } return 0; }(164点数解答 | 2025-11-01 19:14:57)83
- [字节豆包] 给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理: 1.四周最外侧的像素点的值不变; 2.中间各像素点新值为该像素点及其上下左右相邻四个像素点值的平均数(向下取整)。 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1≤n≤100,1≤m≤100。 接下来n行,每行m个整数,表示图像的每个像素点的值。相邻两个整数之间用单个空格隔开,每个元素均在0∼255之间。 输出 n行,每行m个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。 样例输入 复制 4 5 100 0 100 0 50 50 100 200 0 0 50 50 100 100 200 100 100 50 50 100 样例输出 复制 100 0 100 0 50 50 80 100 60 0 50 80 100 90 200 100 100 50 50 100(555点数解答 | 2025-12-09 12:22:26)69
- [DeepSeek] 题目描述 输入四个整数 x , y , a , b x,y,a,b,请你按照要求输出 x ∼ y x∼y 之间的所有数。 要求: 不要输出数字 a a。 不要输出大于等于数字 b b 的数。 输入格式 输入包括一行,包含四个整数 x , y , a , b x,y,a,b,数字之间用空格隔开。 输出格式 输出包括一行,为 x ∼ y x∼y 之间符合要求的数字。 input1 复制 10 20 13 17 output1 复制 10 11 12 14 15 16 input2 复制 50 55 52 100 output2 复制 50 51 53 54 55 样例解释 对于样例 1 1: 样例要求输出 10 ∼ 20 10∼20 之间不是 13 13, 且小于 17 17 的数,故有 10 , 11 , 12 , 14 , 15 , 16 10,11,12,14,15,16。 数据规模与约定 对于 100 % 100% 的数据, 1 ≤ x ≤ y ≤ 100 1≤x≤y≤100, x ≤ a ≤ y x≤a≤y, x ≤ b x≤b。 C++程序(138点数解答 | 2025-07-19 20:44:46)327
- [字节豆包] 题目描述 输入四个整数 x , y , a , b x,y,a,b,请你按照要求输出 x ∼ y x∼y 之间的所有数。 要求: 不要输出数字 a a。 不要输出大于等于数字 b b 的数。 输入格式 输入包括一行,包含四个整数 x , y , a , b x,y,a,b,数字之间用空格隔开。 输出格式 输出包括一行,为 x ∼ y x∼y 之间符合要求的数字。 input1 复制 10 20 13 17 output1 复制 10 11 12 14 15 16 input2 复制 50 55 52 100 output2 复制 50 51 53 54 55 样例解释 对于样例 1 1: 样例要求输出 10 ∼ 20 10∼20 之间不是 13 13, 且小于 17 17 的数,故有 10 , 11 , 12 , 14 , 15 , 16 10,11,12,14,15,16。 数据规模与约定 对于 100 % 100% 的数据, 1 ≤ x ≤ y ≤ 100 1≤x≤y≤100, x ≤ a ≤ y x≤a≤y, x ≤ b x≤b。c++ (304点数解答 | 2025-10-25 20:12:27)72