2023-06-24:给你一根长度为 n 的绳子,

请把绳子剪成整数长度的 m 段,

m、n都是整数,n > 1并且m > 1,

每段绳子的长度记为 k[0],k[1]...k[m - 1]。

请问 k[0]k[1]...*k[m - 1] 可能的最大乘积是多少?

例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

答案需要取模1000000007。

输入: 10。

输出: 36。

答案2023-06-24:

具体步骤如下:

1.如果n <= 3,返回n-1。

2.如果n > 3,计算剩下绳子长度为n - 4,此时剩下的长度为4。

3.如果剩下的长度为0,即n为3的倍数,最后一段长度为1;如果剩下的长度为2,最后一段长度为2;如果剩下的长度为4,最后一段长度为4。

4.计算3的个数,即rest = n - (剩下的长度);计算最后一段的长度last。

5.利用快速幂算法计算3的rest/3次方取mod后的结果,记为power(3, rest/3)。

6.返回(power(3, rest/3) * last) % mod作为最大乘积的结果。

例如,当n为10,按照上述步骤计算:

1.n > 3且不是3的倍数,剩下的长度为2,最后一段长度为2。

2.计算3的个数,rest = n - 2 = 8。

3.计算power(3, rest/3) = power(3, 8/3)。

4.返回(power(3, 8/3) * 2) % mod,计算结果为36,即最大乘积。

因此,输入为10,输出为36。

该代码的时间复杂度为O(log(n)),空间复杂度为O(1)。

在函数power中,通过快速幂算法计算x的n次方,时间复杂度为O(log(n))。在函数cuttingRope中,没有使用任何循环或递归,只有一些简单的判断和计算操作,因此时间复杂度为O(1)。

对于空间复杂度,代码只使用了常数级别的额外空间来存储变量,因此空间复杂度为O(1)。不随输入规模的增加而增加。

go完整代码如下:

  1. package main
  2. import "fmt"
  3. const mod = 1000000007
  4. // power计算x的n次方,取mod后的结果
  5. func power(x int, n int) int {
  6. ans := int64(1)
  7. x64 := int64(x)
  8. n64 := int64(n)
  9. for n64 > 0 {
  10. if n64&1 == 1 {
  11. ans = (ans * x64) % mod
  12. }
  13. x64 = (x64 * x64) % mod
  14. n64 >>= 1
  15. }
  16. return int(ans)
  17. }
  18. // cuttingRope根据观察得到的规律计算绳子的最大乘积
  19. func cuttingRope(n int) int {
  20. if n == 2 {
  21. return 1
  22. }
  23. if n == 3 {
  24. return 2
  25. }
  26. rest := 0
  27. last := 0
  28. if n%3 == 0 {
  29. rest = n
  30. last = 1
  31. } else if n%3 == 1 {
  32. rest = n - 4
  33. last = 4
  34. } else {
  35. rest = n - 2
  36. last = 2
  37. }
  38. return (power(3, rest/3) * last) % mod
  39. }
  40. func main() {
  41. n := 10
  42. result := cuttingRope(n)
  43. fmt.Println("Result:", result)
  44. }

rust完整代码如下:

  1. const MOD: i32 = 1_000_000_007;
  2. fn power(x: i32, n: i32) -> i32 {
  3. let mut ans: i64 = 1;
  4. let mut x: i64 = x as i64;
  5. let mut n: i64 = n as i64;
  6. while n > 0 {
  7. if n & 1 == 1 {
  8. ans = (ans * x) % MOD as i64;
  9. }
  10. x = (x * x) % MOD as i64;
  11. n >>= 1;
  12. }
  13. ans as i32
  14. }
  15. fn cutting_rope(n: i32) -> i32 {
  16. if n == 2 {
  17. return 1;
  18. }
  19. if n == 3 {
  20. return 2;
  21. }
  22. let rest = if n % 3 == 0 { n } else if n % 3 == 1 { n - 4 } else { n - 2 };
  23. let last = if n % 3 == 0 { 1 } else if n % 3 == 1 { 4 } else { 2 };
  24. ((power(3, rest / 3) as i64 * last as i64) % MOD as i64) as i32
  25. }
  26. fn main() {
  27. let n = 10;
  28. let result = cutting_rope(n);
  29. println!("Result: {}", result);
  30. }

c++代码如下:

  1. #include <iostream>
  2. using namespace std;
  3. const int mod = 1000000007;
  4. // power计算x的n次方,取mod后的结果
  5. long long power(long long x, int n) {
  6. long long ans = 1;
  7. while (n > 0) {
  8. if ((n & 1) == 1) {
  9. ans = (ans * x) % mod;
  10. }
  11. x = (x * x) % mod;
  12. n >>= 1;
  13. }
  14. return ans;
  15. }
  16. // cuttingRope根据观察得到的规律计算绳子的最大乘积
  17. int cuttingRope(int n) {
  18. if (n == 2) {
  19. return 1;
  20. }
  21. if (n == 3) {
  22. return 2;
  23. }
  24. int rest = 0, last = 0;
  25. if (n % 3 == 0) {
  26. rest = n;
  27. last = 1;
  28. }
  29. else if (n % 3 == 1) {
  30. rest = n - 4;
  31. last = 4;
  32. }
  33. else {
  34. rest = n - 2;
  35. last = 2;
  36. }
  37. return (int)((power(3, rest / 3) * last) % mod);
  38. }
  39. int main() {
  40. int n = 10;
  41. int result = cuttingRope(n);
  42. cout << "Result: " << result << endl;
  43. return 0;
  44. }

c完整代码如下:

  1. #include <stdio.h>
  2. const int mod = 1000000007;
  3. // power计算x的n次方,取mod后的结果
  4. long long power(long long x, int n) {
  5. long long ans = 1;
  6. while (n > 0) {
  7. if ((n & 1) == 1) {
  8. ans = (ans * x) % mod;
  9. }
  10. x = (x * x) % mod;
  11. n >>= 1;
  12. }
  13. return ans;
  14. }
  15. // cuttingRope根据观察得到的规律计算绳子的最大乘积
  16. int cuttingRope(int n) {
  17. if (n == 2) {
  18. return 1;
  19. }
  20. if (n == 3) {
  21. return 2;
  22. }
  23. int rest = 0, last = 0;
  24. if (n % 3 == 0) {
  25. rest = n;
  26. last = 1;
  27. }
  28. else if (n % 3 == 1) {
  29. rest = n - 4;
  30. last = 4;
  31. }
  32. else {
  33. rest = n - 2;
  34. last = 2;
  35. }
  36. return (int)((power(3, rest / 3) * last) % mod);
  37. }
  38. int main() {
  39. int n = 10;
  40. int result = cuttingRope(n);
  41. printf("Result: %d\n", result);
  42. return 0;
  43. }

2023-06-24:给你一根长度为 n 的绳子, 请把绳子剪成整数长度的 m 段, m、n都是整数,n > 1并且m > 1, 每段绳子的长度记为 k[0],k[1]...k[m - 1]。 请问的更多相关文章

  1. SCU 4313 把一棵树切成每段K个点 (n%k)剩下的点不管

    题目链接:http://cstest.scu.edu.cn/soj/problem.action?id=4313 判断是不是存在拆图得到新连通分支的点个数是K的倍数 注意一个点所连的边只能被切一条 # ...

  2. $O(k^2)$ 求前缀 $k$ 次幂和(与长度无关)

    接下来求解前缀幂次和 求解 \(\sum_{i = 1}^{k} i^k\) \[ \begin{aligned} (p+1)^k - 1 = (p+1)^k - p^k + p^k - (p-1)^ ...

  3. 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器

    本文简述了以下内容: (一)生成式模型的非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻分类器(k-nearest neighbor,kNN) (一)非参数方法(Non-param ...

  4. 在数组a中,a[i]+a[j]=a[k],求a[k]的最大值,a[k]max——猎八哥fly

    在数组a中,a[i]+a[j]=a[k],求a[k]的最大值,a[k]max. 思路:将a中的数组两两相加,组成一个新的数组.并将新的数组和a数组进行sort排序.然后将a数组从大到小与新数组比较,如 ...

  5. [CareerCup] 13.1 Print Last K Lines 打印最后K行

    13.1 Write a method to print the last K lines of an input file using C++. 这道题让我们用C++来打印一个输入文本的最后K行,最 ...

  6. 一些简单的问题. 2的10次方与k (涉及到b k m的要用乘来解读)

    2的10次方是k k就表示2的10次方 2的16次方,解读为 2的6次方(64)*2的10次方(k)  简写为64k    64k=64*k 同理2的20次方  解读为2的10次方*2的10次方  k ...

  7. 快速排序/快速查找(第k个, 前k个问题)

    //快速排序:Partition分割函数,三数中值分割 bool g_bInvalidInput = false; int median3(int* data, int start, int end) ...

  8. [LeetCode] Top K Frequent Words 前K个高频词

    Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...

  9. [LeetCode] K Inverse Pairs Array K个翻转对数组

    Given two integers n and k, find how many different arrays consist of numbers from 1 to n such that ...

  10. [Swift]LeetCode373. 查找和最小的K对数字 | Find K Pairs with Smallest Sums

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...

随机推荐

  1. odbe简介

    Odbc简介 今天工作中遇到一个问题,缺少某个数据库驱动程序,百度半天才发现原来室odbc原因,所以,就捎带学习了一下odbc, ODBC数据源中文名称:开放数据库互联英文名称:Open Databa ...

  2. 理解String、StringBuilder和StringBuffer

    1. String.StringBuilder和StringBuffer异同 相同点:底层都是通过char数组实现的 不同点: String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空 ...

  3. [SDR] GNU Radio 系列教程(十四) —— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解

    目录 1.前言 2.ZMQ 块的类型 3.ZMQ 块的使用 4.DEMO 4.1 同一台电脑上的两个流程图 4.2 不同电脑上的两个流程图 4.3 作为 REQ/REP 服务器的 Python 程序 ...

  4. RK3568用户自定义开机画面功能

    RK方案中的开机画面处画逻辑 在RK的方案中,如RK1109,RK1126,RK3568这些嵌入式LINUX方案在开机画面的处理逻辑都是一致的. 用户的uboot,kernel开机画面都是同dts,k ...

  5. [C++核心编程] 5 文件操作

    文章目录 5 文件操作 5.1文本文件 5.1.1写文件 5.1.2读文件 5.2 二进制文件 5.2.1 写文件 5.2.2 读文件 5 文件操作 程序运行时产生的数据都属于临时数据,程序一旦运行结 ...

  6. KMP算法学习笔记

    总算把这个东西搞懂了...... KMP是一个求解字符串匹配问题的算法. 这个东西的核心是一个\(next\)数组,\(next_i\)表示字符串第\(0\sim i\)项的相同的前缀和后缀的最大长度 ...

  7. 【解决方法】域控制器升级报错-Verification of prerequisites for Domain Controller promotion failed.......

    目录-快速跳转 问题描述 原因分析: 解决方案: 附言: 问题描述 在 VM 内 windows 2019 中域控制器安装完成后进行第一次设置进行Prerequisites Check(先决条件检查) ...

  8. 讯飞星火大模型 与New Bing实测对比

    昨天科大讯飞发布了讯飞星火认知大模型,在发布会现场实测大模型的7种核心能力,并发布了它在教育.办公.汽车.数字员工领域的应用成果.科大讯飞董事长刘庆峰表示:认知大模型展示了通用人工智能的曙光,讯飞星火 ...

  9. 2020-10-19:golang里defer为什么要逆序执行?顺序执行不是更符合人的习惯吗?

    福哥答案2020-10-19: 后面定义的函数可能会依赖前面的资源,所以要先执行.如果前面先执行,释放掉这个依赖,那后面的函数就不能找到它的依赖了.***[评论](https://user.qzone ...

  10. 2021-06-13:如果一个节点X,它左树结构和右树结构完全一样,那么我们说以X为头的树是相等树。给定一棵二叉树的头节点head,返回head整棵树上有多少棵相等子树。

    2021-06-13:如果一个节点X,它左树结构和右树结构完全一样,那么我们说以X为头的树是相等树.给定一棵二叉树的头节点head,返回head整棵树上有多少棵相等子树. 福大大 答案2021-06- ...