牛客12579题解析:递归求解1~N最大奇约数之和的优化解法
1天前
一、题目解读
牛客12579题要求计算1到N的最大奇约数之和。题目核心在于理解“奇约数”概念,即N的所有奇因子之和。需高效处理大规模数据,避免超时,因此需挖掘数学规律结合算法优化。
二、解题思路
采用递归策略,巧妙将问题分解为奇数和偶数部分:
1. 奇数部分:利用等差数列求和公式。1到N的奇数和为前k个奇数的和(k=(N+1)/2),即k^2。
2. 偶数部分:递归调用calculateSum(N/2),因偶数因子可视为1~N/2的因子扩展(如2x的因子包含x的因子)。
3. 边界处理:N<1时直接返回0,多组输入用循环接收。
三、解题步骤
1. 输入处理:循环读取N,若N≤0输出0并跳过。
2. 计算奇数部分:通过(N+1)/2获取奇数个数,平方求和。
3. 递归计算偶数部分:调用calculateSum(N/2),叠加结果。
4. 合并输出:返回奇偶部分和。
四、代码与注释
#include <iostream> using namespace std; // 递归计算1~N的最大奇约数和 long long calculateSum(int N) { if(N < 1) return 0; // 边界条件处理 long long odd_cnt = (N + 1) / 2; // 奇数个数 long long odd_sum = odd_cnt * odd_cnt; // 等差数列求和 return odd_sum + calculateSum(N / 2); // 递归叠加偶数部分 } int main() { int N; while(cin >> N) { // 处理多组输入 if(N <= 0) { cout << 0 << endl; continue; } cout << calculateSum(N) << endl; } return 0; }
注释解析:通过数学推导简化计算,递归深度随N减半,时间复杂度O(logN),空间复杂度O(1)。
五、总结
该解法通过奇偶分解与等差数列公式大幅降低计算量,递归结构清晰且无需额外空间。关键在于识别数学规律与递归边界设计,适用于求解因子相关的优化问题
原创内容 转载请注明出处