首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1: 输入: n = 5 输出: 2 解释: 5 = 2 +

2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1: 输入: n = 5 输出: 2 解释: 5 = 2 +

原创
作者头像
福大大架构师每日一题
发布于 2022-09-09 14:35:41
发布于 2022-09-09 14:35:41
9310
举报

2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。

示例 1:

输入: n = 5

输出: 2

解释: 5 = 2 + 3,共有两组连续整数(5,2,3)求和后为 5。

示例 2:

输入: n = 9

输出: 3

解释: 9 = 4 + 5 = 2 + 3 + 4

示例 3:

输入: n = 15

输出: 4

解释: 15 = 8 + 7 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5

答案2022-09-09:

如果有,N = (x+1) + (x+2) + ... + (x+k)

上式子可以化简为:N = kx + k(k+1)/2

左右两边同时乘以2,可以得到:2N = 2kx + k^2 + k

进而得到:2N = k(2x + k + 1)

2N 偶 k * (2x + k + 1)

k 2x + k + 1

所以,对于2N = k(2x + k + 1),这个式子来说,只要给定不同的一组x和k,就对应一种不同的方案

进一步分析可以看出:

如果k为偶数,那么2x + k + 1就是奇数

如果k为奇数,那么2x + k + 1就是偶数

2N = 左 K 右 2x + k + 1

2N 奇数因子K, 2x + k + 1

也就是说,对于每一种方案,k和2x + k + 1,一定是不同的,并且连奇偶性都相反

所以2N里任何一个奇数因子,可能作为k这一项,也可能作为2x+k+1这一项,

不管奇数因子作为哪一项,都可以推出另外一项的值,进而确定k和x具体是多少

进而可以推出,2N里有多少个奇数因子,就有多少种方案

于是这个题就变成了求N里有多少奇数因子

一般来说,求N里有多少奇数因子,用O(根号N)的方法肯定可以

但其实可以更加的优化,

如果 N = 3^a 5^b 7^c * 9^d ....那么N一共会出现多少奇数因子呢?

N的质数因子:可以选择0个3..可以选择1个3...可以选择2个3...可以选择a个3,所以有a+1种选择

上面的选择,去乘以:可以选择0个5..可以选择1个5...可以选择2个5...可以选择b个5,所以有b+1种选择

上面的选择,去乘以:可以选择0个7..可以选择1个7...可以选择2个7...可以选择c个7,所以有c+1种选择

...

所以,一共有(a + 1) (b + 1) (c + 1) * (d + 1) .....这么多个奇数因子。

代码用rust编写。代码如下:

代码语言:rust
AI代码解释
复制
fn main() {
    let n = 3 * 5 * 7;
    let ans = consecutive_numbers_sum1(n);
    println!("ans = {}", ans);
    let ans = consecutive_numbers_sum2(n);
    println!("ans = {}", ans);
}

fn consecutive_numbers_sum1(mut n: i32) -> i32 {
    while (n & 1) == 0 {
        n >>= 1;
    }
    let mut res = 1;
    let mut i = 3;
    while i <= n {
        let mut count = 1;
        while n % i == 0 {
            n /= i;
            count += 1;
        }
        res *= count;
        i += 2
    }
    return res;
}

// 进一步优化
fn consecutive_numbers_sum2(mut n: i32) -> i32 {
    while (n & 1) == 0 {
        n >>= 1;
    }
    let mut res = 1;
    // O(根号N)
    let mut i = 3;
    while i * i <= n {
        let mut count = 1;
        while n % i == 0 {
            n /= i;
            count += 1;
        }
        // rest *= (计数+1)
        res *= count;
        i += 2
    }
    // N == 1表示已经找到了所有奇数因子
    // N != 1表示只残留着最后一个奇数因子了
    // 简单证明:如果N最后残留着不只一个奇数因子,
    // 比如x*y(不妨设x<y),那么在for循环里,就依然会有i*i <= N
    // 因为i=x时,x*x <= x*y,所以x在for循环里就能计算到
    // 所以如果N != 1表示只残留着一个奇数因子
    return if n == 1 { res } else { res << 1 };
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1:输入: n = 5输出:
2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。
福大大架构师每日一题
2022/11/06
8850
2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1:输入: n = 5输出:
2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n =
2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n = 100。 输出:10。
福大大架构师每日一题
2023/07/25
4920
2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n =
2023-05-02:如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一个正整数 n ,请你返回区间 [1, n] 之间特殊整数的数目
2023-05-02:如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。
福大大架构师每日一题
2023/05/02
3050
2023-05-02:如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一个正整数 n ,请你返回区间 [1, n] 之间特殊整数的数目
2022-06-19:给出n个数字,你可以任选其中一些数字相乘,相乘之后得到的新数字x, x的价值是x的不同质因子的数量。 返回所有选择数字的方案中,得到的x的
2022-06-19:给出n个数字,你可以任选其中一些数字相乘,相乘之后得到的新数字x,
福大大架构师每日一题
2022/06/19
8090
2022-06-19:给出n个数字,你可以任选其中一些数字相乘,相乘之后得到的新数字x, x的价值是x的不同质因子的数量。 返回所有选择数字的方案中,得到的x的
2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?
2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?
福大大架构师每日一题
2022/07/09
9170
2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?
2023-05-17:一个正整数如果能被 a 或 b 整除,那么它是神奇的。 给定三个整数 n , a , b ,返回第 n 个神奇的数字。 因为答案可能很大,
2.初始化变量 l 为0,变量 r 为 (n * min(a, b)),其中 min(a, b) 表示 a 和 b 中的最小值。在这个范围内通过二分查找获得第 n 个神奇数字。
福大大架构师每日一题
2023/05/17
5150
2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从
2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从这n个孩子中选出k个孩子。
福大大架构师每日一题
2024/09/06
1650
2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从
2023-05-29:给你一个由 n 个正整数组成的数组 nums 你可以对数组的任意元素执行任意次数的两类操作 如果元素是 偶数 ,除以 2 例如,如果数组是
例如,如果数组是 1,2,3,4 ,那么你可以对第一个元素执行此操作,使其变成 2,2,3,4
福大大架构师每日一题
2023/05/29
5680
2023-04-10:给定两个正整数x、y,都是int整型(java里) 返回0 ~ x以内,每位数字加起来是y的数字个数。 比如,x = 20、y = 5,返
本文介绍了两种解决给定 x 和 y,求 0~x 中每位数字之和为 y 的数字个数的方法。第一种方法使用暴力枚举的方式,遍历 0~x 中的每一个数字,计算其每位数字之和是否等于 y,并统计符合条件的数字数量。第二种方法使用动态规划的思想,通过数位 DP 的方式快速计算符合条件的数字数量。
福大大架构师每日一题
2023/04/10
5750
2023-04-10:给定两个正整数x、y,都是int整型(java里) 返回0 ~ x以内,每位数字加起来是y的数字个数。 比如,x = 20、y = 5,返
2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,
第一种算法(canPartitionKSubsets1)使用动态规划的思想,具体过程如下:
福大大架构师每日一题
2023/09/19
2740
2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,
2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数 x 的每一
2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数 x 的每一位数字都替换为 x 中的最大数字,然后返回加密后的数字。
福大大架构师每日一题
2024/09/18
1180
2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数 x 的每一
2022-09-07:给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。 例如,序列 [4,6,16
数组的一个 子序列 本质是一个序列,可以通过删除数组中的某些元素(或者不删除)得到。
福大大架构师每日一题
2022/09/07
7770
2022-09-07:给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。 例如,序列 [4,6,16
2023-03-18:给定一个长度n的数组,每次可以选择一个数x, 让这个数组中所有的x都变成x+1,问你最少的操作次数, 使得这个数组变成一个非降数组。 n
本题可以用多种算法来解决,下面我们将介绍四种常见的做法,分别是暴力枚举、动态规划、单调栈和差分。
福大大架构师每日一题
2023/03/18
1.1K0
2023-03-18:给定一个长度n的数组,每次可以选择一个数x, 让这个数组中所有的x都变成x+1,问你最少的操作次数, 使得这个数组变成一个非降数组。 n
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大,怎么算最快? 来自Amazon。 答案
福大大架构师每日一题
2022/06/17
6310
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大
2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数组 queries,
2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数组 queries,每个操作由一个下标值 indexi 和一个数值 ki 组成。
福大大架构师每日一题
2024/09/19
1890
2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数组 queries,
2022-06-16:给定一个数组arr,含有n个数字,都是非负数,给定一个正数k,返回所有子序列中,累加和最小的前k个子序列累
[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_04_1_week/Code06_TopMinSubsquenceSum.java)
福大大架构师每日一题
2023/06/08
3900
2022-06-16:给定一个数组arr,含有n个数字,都是非负数,给定一个正数k,返回所有子序列中,累加和最小的前k个子序列累
2023-09-30:用go语言,给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1, 每一次移动,你
2023-09-30:用go语言,给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1,
福大大架构师每日一题
2023/10/05
2870
2023-09-30:用go语言,给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1, 每一次移动,你
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最快? 来自亚马逊。 答案2022-06-
福大大架构师每日一题
2022/06/16
6180
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最
2022-07-07:原本数组中都是大于0、小于等于k的数字,是一个单调不减的数组,其中可能有相等的数字,总体趋势是递增的。但是
2022-07-07:原本数组中都是大于0、小于等于k的数字,是一个单调不减的数组,
福大大架构师每日一题
2023/06/08
2790
2022-07-07:原本数组中都是大于0、小于等于k的数字,是一个单调不减的数组,其中可能有相等的数字,总体趋势是递增的。但是
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。
福大大架构师每日一题
2022/06/23
3380
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
推荐阅读
2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1:输入: n = 5输出:
8850
2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n =
4920
2023-05-02:如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一个正整数 n ,请你返回区间 [1, n] 之间特殊整数的数目
3050
2022-06-19:给出n个数字,你可以任选其中一些数字相乘,相乘之后得到的新数字x, x的价值是x的不同质因子的数量。 返回所有选择数字的方案中,得到的x的
8090
2022-07-09:总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数?
9170
2023-05-17:一个正整数如果能被 a 或 b 整除,那么它是神奇的。 给定三个整数 n , a , b ,返回第 n 个神奇的数字。 因为答案可能很大,
5150
2024-09-04:用go语言,给定一个长度为n的数组 happiness,表示每个孩子的幸福值,以及一个正整数k,我们需要从
1650
2023-05-29:给你一个由 n 个正整数组成的数组 nums 你可以对数组的任意元素执行任意次数的两类操作 如果元素是 偶数 ,除以 2 例如,如果数组是
5680
2023-04-10:给定两个正整数x、y,都是int整型(java里) 返回0 ~ x以内,每位数字加起来是y的数字个数。 比如,x = 20、y = 5,返
5750
2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,
2740
2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数 x 的每一
1180
2022-09-07:给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。 例如,序列 [4,6,16
7770
2023-03-18:给定一个长度n的数组,每次可以选择一个数x, 让这个数组中所有的x都变成x+1,问你最少的操作次数, 使得这个数组变成一个非降数组。 n
1.1K0
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大
6310
2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数组 queries,
1890
2022-06-16:给定一个数组arr,含有n个数字,都是非负数,给定一个正数k,返回所有子序列中,累加和最小的前k个子序列累
3900
2023-09-30:用go语言,给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1, 每一次移动,你
2870
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最
6180
2022-07-07:原本数组中都是大于0、小于等于k的数字,是一个单调不减的数组,其中可能有相等的数字,总体趋势是递增的。但是
2790
2022-06-23:给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和。 n比较大,10的5次方。 来自美团。3.26笔试。
3380
相关推荐
2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1:输入: n = 5输出:
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档