输入整数 𝑛 ( 1 ≤ 𝑛 < 2 31 ) ,求至少两个正整数,使它们的最小公倍数为 𝑛 ,且这些整数的和最小。 输出最小的和。 输入 有多组测试输入,以 0 结束。 输出 对于每个n,输出分解出的最小的和。 样例输入 复制 12 10 5 0 样例输出 复制 7 7 6
问题分析 给定整数 \( n \),要求找到至少两个正整数,它们的最小公倍数为 \( n \),且这些数的和最小。输出最小的和。 关键思路 1. 若 \( n \) 是质数或质数的幂,则至少需要两个数,最小和为 \( n + 1 \)(例如 \( n \) 和 1 的最小公倍数为 \( n \),但 1 不能重复使用,所以用 \( n \) 和 1 不满足“至少两个正整数”吗?注意:1 是正整数,但 1 和 n 的最小公倍数是 n,且 1 + n = n+1。 但更优分解:若 \( n = p^k \)(p 是质数),可分解为 \( p^{k-1} \) 和 \( p \),最小公倍数为 \( p^k = n \),和为 \( p^{k-1} + p \),这比 \( n+1 \) 小吗? 检验:\( p^{k-1} + p \) 与 \( p^k + 1 \) 比较。 例如 \( p=2, k=3, n=8 \): - 分解为 4 和 2:和=6 - 分解为 8 和 1:和=9 所以更优。 2. 一般情况: 设 \( n = p_1^{a_1} p_2^{a_2} \dots p_m^{a_m} \)(质因数分解)。 最小公倍数为 n 的条件:每个质因子的幂次最大值等于 \( a_i \)。 要使得总和最小,应尽量让每个数只含部分质因子,避免重复包含多个质因子的高次幂。 最优策略:每个质因子的幂 \( p_i^{a_i} \) 单独作为一个数,这样这些数两两互质,最小公倍数就是乘积 n,且和为 \( \sum p_i^{a_i} \)。 但注意:至少两个数,所以如果 m=1(n 是质数幂),则必须拆成至少两个数,上面已讨论。 3. 特殊情况:n=1 时,至少两个正整数最小公倍数为 1,只能是 1 和 1,和为 2。但题目 n ≥ 1,且 n=1 时?题目 n < 2^31,没说 n>1,但至少两个正整数最小公倍数为 1 只能是 1 和 1,和=2。 算法步骤 1. 对 n 进行质因数分解。 2. 如果只有一个质因子(m=1),即 \( n = p^a \): - 若 a=1(n 是质数),只能拆成 1 和 n,和 = n+1。 - 若 a>1,最优拆成 \( p^{a-1} \) 和 \( p \),和 = \( p^{a-1} + p \)。 3. 如果有多个质因子(m≥2),最优和为各个质因子幂的和:\( \sum_{i=1}^m p_i^{a_i} \)。 4. 注意:如果 n=1,质因数分解为空,此时和为 2(1+1)。 验证样例 - n=12 = 2^2 * 3^1 → 质因子幂:4 和 3,和=7。 - n=10 = 2^1 * 5^1 → 质因子幂:2 和 5,和=7。 - n=5 = 5^1(质数)→ 和=5+1=6。 符合样例输出。 代码实现(C++) ```cpp #include <iostream> #include <cmath> using namespace std; long long solve(long long n) { if (n == 1) return 2; long long sum = 0; int cnt = 0; for (long long i = 2; i * i <= n; i++) { if (n % i == 0) { cnt++; long long p = 1; while (n % i == 0) { n /= i; p *= i; } sum += p; } } if (n > 1) { // 剩下一个质因子 cnt++; sum += n; } if (cnt == 1) { // n 是质数或质数的幂 // 需要拆成至少两个数 // 如果原数是质数,则只能拆成 1 和 n,和 = n+1 // 如果原数是质数的幂 p^a,最优拆成 p^(a-1) 和 p // 但上面 sum 此时等于 p^a,需要调整: // 例如 n=8=2^3,sum=8,但最优是 4+2=6。 // 所以需要找到质因子 p 和幂次 a // 简便方法:sum 是 p^a,最优和是 p^(a-1) + p // 即 sum / p + p,其中 p 是最小的质因子。 // 但我们已经除尽了,所以需要重新求 p 和 a?可以在循环中记录。 // 这里简化:如果 cnt==1,说明 n 最初是 p^a,现在 n=1,p 和 a 丢失了。 // 所以需要在循环中记录。 // 修改:在循环中记录 p 和 a。 } return sum; } // 修正版本:记录质因子和幂次 long long solve2(long long n) { if (n == 1) return 2; long long sum = 0; int cnt = 0; long long last_p = 1, last_a = 0; long long original_n = n; for (long long i = 2; i * i <= n; i++) { if (n % i == 0) { cnt++; long long p = 1; int a = 0; while (n % i == 0) { n /= i; p *= i; a++; } sum += p; if (cnt == 1) { last_p = i; last_a = a; } } } if (n > 1) { cnt++; sum += n; if (cnt == 1) { last_p = n; last_a = 1; } } if (cnt == 1) { // n 原来是 last_p^last_a // 最优拆成 last_p^(last_a-1) 和 last_p long long p = last_p; long long a = last_a; long long best = pow(p, a-1) + p; // 但注意 a=1 时(质数),pow(p,0)=1,和=p+1 return best; } return sum; } int main() { long long n; while (cin >> n && n != 0) { cout << solve2(n) << endl; } return 0; } ``` 说明 - 使用质因数分解,对每个质因子取最高次幂作为一个数。 - 如果只有一个质因子,需要拆成两个数使得和最小。 - 注意 n=1 的特殊情况。 - 多组输入以 0 结束。 [2026-01-11 17:48:52 | AI问答 | 1677点数解答]
- [字节豆包] 题目描述 给定一个包含 n n 个整数的数列,请统计其中有多少个整数满足大于 x x 且小于 y y,并输出所有满足要求的整数之和 例如: n n = 6 6,数列为 [ 13 , 31 , 45 , 17 , 20 , 99 ] [13,31,45,17,20,99]; x = 18 x=18, y = 50 y=50,数列中满足大于 18 18 且小于 50 50 的整数有 31 、 45 、 20 31、45、20,和为 96 ( 31 + 45 + 20 ) 96(31+45+20)。 输入格式 第一行输入三个整数 n n、 x x 和 y y,整数之间以一个空格隔开; 第二行输入 n n 个整数,整数之间以一个空格隔开。 输出格式 输出一个整数,表示数列中所有满足大于 x x 且小于 y y 的整数之和。 input1 复制 6 18 50 13 31 45 17 20 99 output1 复制 96 数据规模与约定 1 ≤ n ≤ 1000 1≤n≤1000, 1 ≤ x < y ≤ 5000 1≤x<y≤5000, 1 ≤ 1≤ 每个(281点数解答 | 2025-11-29 20:20:58)98
- [字节豆包] #include <stdio.h> struct DateG { int yy, mm, dd; }; // 判断是否为闰年 char leapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 每个月的天数 int monthDays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 计算自公元1年1月1日到指定的日期共经历了多少天 int Days(struct DateG x) { int days = 0; // 计算之前年份的总天数 for (int year = 1; year < x.yy; year++) { days += 365 + leapYear(year); } // 计算当前年份到当前月份之前的总天数 for (int month = 1; month < x.mm; month++(1504点数解答 | 2025-12-12 20:54:15)37
- [DeepSeek] 给定一个包含 n n 个整数的数列,请统计其中有多少个整数满足大于 x x 且小于 y y,并输出所有满足要求的整数之和 例如: n n = 6 6,数列为 [ 13 , 31 , 45 , 17 , 20 , 99 ] [13,31,45,17,20,99]; x = 18 x=18, y = 50 y=50,数列中满足大于 18 18 且小于 50 50 的整数有 31 、 45 、 20 31、45、20,和为 96 ( 31 + 45 + 20 ) 96(31+45+20)。 输入格式 第一行输入三个整数 n n、 x x 和 y y,整数之间以一个空格隔开; 第二行输入 n n 个整数,整数之间以一个空格隔开。 输出格式 输出一个整数,表示数列中所有满足大于 x x 且小于 y y 的整数之和。c++ (168点数解答 | 2025-11-14 16:47:26)77
- [DeepSeek] 给定一个包含 n n 个整数的数列,请统计其中有多少个整数满足大于 x x 且小于 y y,并输出所有满足要求的整数之和 例如: n n = 6 6,数列为 [ 13 , 31 , 45 , 17 , 20 , 99 ] [13,31,45,17,20,99]; x = 18 x=18, y = 50 y=50,数列中满足大于 18 18 且小于 50 50 的整数有 31 、 45 、 20 31、45、20,和为 96 ( 31 + 45 + 20 ) 96(31+45+20)。 输入格式 第一行输入三个整数 n n、 x x 和 y y,整数之间以一个空格隔开; 第二行输入 n n 个整数,整数之间以一个空格隔开。 输出格式 输出一个整数,表示数列中所有满足大于 x x 且小于 y y 的整数之和。 使用c++语言(101点数解答 | 2026-01-18 19:03:32)26
- [字节豆包] 三倍子串 内存限制: 256 Mb时间限制: 1000 ms 题目描述 给定一个十进制正整数 n n,请问可以从 n n 中截取多少种不同的子串,使得子串构成的数字是 3 3 的倍数。 例如:当 n = 1234 n=1234 时,有且仅有 3 3, 12 12, 123 123, 234 234 这四个子串是 3 3 的倍数。 输入格式 单个整数:表示输入的数字 n n 输出格式 单个整数:表示 3 3 的倍数的子串数量。 数据范围 对于 20 % 20% 的数据, 1 ≤ n ≤ 1 0 9 1≤n≤10 9 ; 对于 50 % 50% 的数据, 1 ≤ n ≤ 1 0 100 1≤n≤10 100 ; 对于 70 % 70% 的数据, 1 ≤ n ≤ 1 0 1000 1≤n≤10 1000 ; 对于 100 % 100% 的数据, 1 ≤ n ≤ 1 0 100000 1≤n≤10 100000 样例数据 输入: 95764 输出: 6 说明: 子串6,9,57,576,957,9576是3的倍数 输入: 1111 输出: 2 说(486点数解答 | 2025-08-29 11:52:55)231
- [字节豆包] 题目描述 给定一个十进制正整数 n n,写下从 1 1 到 n n 的所有整数,然后数一下每个数的各个数位中出现的数字 1 1 的个数。 例如: 当 n = 2 n=2 时,写下 1 , 2 1,2。这样只出现了 1 1 个 1 1; 当 n = 12 n=12 时,写下 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 1,2,3,4,5,6,7,8,9,10,11,12。这样出现了 5 5 个 1 1。 输入格式 一行,一个正整数 n n。 输出格式 一个正整数,即 1 1 的个数。 input1 复制 9 output1 复制 1 input2 复制 12 output2 复制 5 数据规模与约定 对于 100 % 100% 的数据, 1 ≤ n ≤ 10000 1≤n≤10000。用C++简答 回答篇幅:简单明了(118点数解答 | 2026-01-14 22:06:25)27
- [字节豆包] 题目描述 给定一个十进制正整数 n n,写下从 1 1 到 n n 的所有整数,然后数一下每个数的各个数位中出现的数字 1 1 的个数。 例如: 当 n = 2 n=2 时,写下 1 , 2 1,2。这样只出现了 1 1 个 1 1; 当 n = 12 n=12 时,写下 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 1,2,3,4,5,6,7,8,9,10,11,12。这样出现了 5 5 个 1 1。 输入格式 一行,一个正整数 n n。 输出格式 一个正整数,即 1 1 的个数。 input1 复制 9 output1 复制 1 input2 复制 12 output2 复制 5 数据规模与约定 对于 100 % 100% 的数据, 1 ≤ n ≤ 10000 1≤n≤10000。 C++(413点数解答 | 2026-01-26 17:56:10)21
- [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)328
- [字节豆包] 题目描述 输入四个整数 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
- [DeepSeek] 小核桃准备使用 a 数组,存储战力为1~10的守卫各有多少个。 即:a[1] 存储战斗力为1的守卫数量,a[2] 存储战斗力为 2 的守卫数量,... 依次类推,a[10] 存储战斗力为 10 的守卫数量。 请你编写程序,使用数组依次存储战力1~10的守卫数量,并按数组下标顺序(从小到大),依次输出每个守卫的战力。 样例1解释: 样例1 输入数据依次表示:战力为1 的守卫有 3 个,战力为3的守卫有 1 个,战力 为4 的守卫有 2 个,战力为 8 的守卫有 2 个,其余战力为2.5.6.7.9.10的守卫数量都为 0。 所以依次输出 三 个 1,一个 3,两个 4,两个 8。 输入: 十个整数,即1~10中每个数的个数。 输出: 一行若干个整数,为从小到大排好序的数,相邻数字之间用空格隔开。 c++(130点数解答 | 2026-01-17 14:11:22)31
- [字节豆包] 题目描述 读入一个 的数字矩阵,输出数字矩阵的主对角线之和。 即自左上到右下这条对角线。 输入 读入一个整数 , 不超过 。 接下来读入 行 列的数字矩阵。每个数字的范围在 ~ 之间。 输出 输出数字矩阵的主对角线之和。 样例输入 复制 10 10 4 4 3 7 9 8 5 7 9 10 10 6 3 10 3 6 4 10 3 4 10 4 1 4 4 8 8 8 7 7 9 9 9 9 9 10 4 3 5 1 6 2 6 4 6 6 5 8 10 3 9 8 7 6 9 8 7 6 4 2 7 9 5 7 3 5 4 8 4 1 2 1 4 10 3 2 2 8 2 10 6 10 8 5 5 10 9 6 6 7 6 4 5 10 5 6 5 10 9 样例输出 复制(358点数解答 | 2025-12-08 12:25:06)54
- [字节豆包] 题目描述 读入一个 的数字矩阵,输出数字矩阵左上角的数字之和。 如上图蓝色部分所示:副对角线数字上方的就是左上角数字。 输入 读入一个整数 , 不超过 。 接下来读入 行 列的数字矩阵。每个数字的范围在 ~ 之间。 输出 输出数字矩阵的左上角之和。 样例输入 复制 10 10 4 4 3 7 9 8 5 7 9 10 10 6 3 10 3 6 4 10 3 4 10 4 1 4 4 8 8 8 7 7 9 9 9 9 9 10 4 3 5 1 6 2 6 4 6 6 5 8 10 3 9 8 7 6 9 8 7 6 4 2 7 9 5 7 3 5 4 8 4 1 2 1 4 10 3 2 2 8 2 10 6 10 8 5 5 10 9 6 6 7 6 4 5 10 5 6 5 10 9 样例输出 复制 273(333点数解答 | 2025-12-08 17:52:36)52