当前位置:首页 > 牛客 > 牛客12579题解析:递归求解1~N最大奇约数之和的优化解法

牛客12579题解析:递归求解1~N最大奇约数之和的优化解法

2个月前 (06-05)

牛客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)。

五、总结

该解法通过奇偶分解与等差数列公式大幅降低计算量,递归结构清晰且无需额外空间。关键在于识别数学规律与递归边界设计,适用于求解因子相关的优化问题


原创内容 转载请注明出处

分享给朋友:

相关文章

汉诺塔问题递归解法(C++代码详解) 牛客4414题解题指南

汉诺塔问题递归解法(C++代码详解) 牛客4414题解题指南

一、题目解读汉诺塔问题是一个经典的递归算法题目:有n个大小不同的圆盘按从大到小顺序放在柱A上,需借助柱B,将圆盘移至柱C,每次只能移动一个圆盘,且大圆盘不能置于小圆盘之上。牛客4414题要求编写函数输...

牛客4493题解析:桶排序优化求解最大间隔问题(附代码详解)

牛客4493题解析:桶排序优化求解最大间隔问题(附代码详解)

一、题目解读牛客4493题要求在一个整数数组中寻找最大间隔,即数组中任意两个元素之间的最大差值。题目强调需要高效算法,尤其在处理大规模数据时仍需保持性能。理解题目核心在于如何快速定位元素间的最远距离,...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

一、题目解读牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘...

力扣面试08.12题解析:N皇后问题的回溯法高效解题(C++代码实现)

力扣面试08.12题解析:N皇后问题的回溯法高效解题(C++代码实现)

一、题目解读力扣面试08.12题要求解决经典的N皇后问题:在n×n的棋盘上放置n个皇后,使得任意两个皇后不处于同一行、列或对角线上。题目需要返回所有可能的合法布局,通常使用回溯算法进行求解。该问题考验...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。