2023-06-24:给你一根长度为 n 的绳子, 请把绳子剪成整数长度的 m 段, m、n都是整数,n > 1并且m > 1, 每段绳子的长度记为 k[0],k[1]...k[m - 1]。 请问
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完整代码如下:
package main
import "fmt"
const mod = 1000000007
// power计算x的n次方,取mod后的结果
func power(x int, n int) int {
ans := int64(1)
x64 := int64(x)
n64 := int64(n)
for n64 > 0 {
if n64&1 == 1 {
ans = (ans * x64) % mod
}
x64 = (x64 * x64) % mod
n64 >>= 1
}
return int(ans)
}
// cuttingRope根据观察得到的规律计算绳子的最大乘积
func cuttingRope(n int) int {
if n == 2 {
return 1
}
if n == 3 {
return 2
}
rest := 0
last := 0
if n%3 == 0 {
rest = n
last = 1
} else if n%3 == 1 {
rest = n - 4
last = 4
} else {
rest = n - 2
last = 2
}
return (power(3, rest/3) * last) % mod
}
func main() {
n := 10
result := cuttingRope(n)
fmt.Println("Result:", result)
}

rust完整代码如下:
const MOD: i32 = 1_000_000_007;
fn power(x: i32, n: i32) -> i32 {
let mut ans: i64 = 1;
let mut x: i64 = x as i64;
let mut n: i64 = n as i64;
while n > 0 {
if n & 1 == 1 {
ans = (ans * x) % MOD as i64;
}
x = (x * x) % MOD as i64;
n >>= 1;
}
ans as i32
}
fn cutting_rope(n: i32) -> i32 {
if n == 2 {
return 1;
}
if n == 3 {
return 2;
}
let rest = if n % 3 == 0 { n } else if n % 3 == 1 { n - 4 } else { n - 2 };
let last = if n % 3 == 0 { 1 } else if n % 3 == 1 { 4 } else { 2 };
((power(3, rest / 3) as i64 * last as i64) % MOD as i64) as i32
}
fn main() {
let n = 10;
let result = cutting_rope(n);
println!("Result: {}", result);
}

c++代码如下:
#include <iostream>
using namespace std;
const int mod = 1000000007;
// power计算x的n次方,取mod后的结果
long long power(long long x, int n) {
long long ans = 1;
while (n > 0) {
if ((n & 1) == 1) {
ans = (ans * x) % mod;
}
x = (x * x) % mod;
n >>= 1;
}
return ans;
}
// cuttingRope根据观察得到的规律计算绳子的最大乘积
int cuttingRope(int n) {
if (n == 2) {
return 1;
}
if (n == 3) {
return 2;
}
int rest = 0, last = 0;
if (n % 3 == 0) {
rest = n;
last = 1;
}
else if (n % 3 == 1) {
rest = n - 4;
last = 4;
}
else {
rest = n - 2;
last = 2;
}
return (int)((power(3, rest / 3) * last) % mod);
}
int main() {
int n = 10;
int result = cuttingRope(n);
cout << "Result: " << result << endl;
return 0;
}

c完整代码如下:
#include <stdio.h>
const int mod = 1000000007;
// power计算x的n次方,取mod后的结果
long long power(long long x, int n) {
long long ans = 1;
while (n > 0) {
if ((n & 1) == 1) {
ans = (ans * x) % mod;
}
x = (x * x) % mod;
n >>= 1;
}
return ans;
}
// cuttingRope根据观察得到的规律计算绳子的最大乘积
int cuttingRope(int n) {
if (n == 2) {
return 1;
}
if (n == 3) {
return 2;
}
int rest = 0, last = 0;
if (n % 3 == 0) {
rest = n;
last = 1;
}
else if (n % 3 == 1) {
rest = n - 4;
last = 4;
}
else {
rest = n - 2;
last = 2;
}
return (int)((power(3, rest / 3) * last) % mod);
}
int main() {
int n = 10;
int result = cuttingRope(n);
printf("Result: %d\n", result);
return 0;
}

2023-06-24:给你一根长度为 n 的绳子, 请把绳子剪成整数长度的 m 段, m、n都是整数,n > 1并且m > 1, 每段绳子的长度记为 k[0],k[1]...k[m - 1]。 请问的更多相关文章
- SCU 4313 把一棵树切成每段K个点 (n%k)剩下的点不管
题目链接:http://cstest.scu.edu.cn/soj/problem.action?id=4313 判断是不是存在拆图得到新连通分支的点个数是K的倍数 注意一个点所连的边只能被切一条 # ...
- $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)^ ...
- 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器
本文简述了以下内容: (一)生成式模型的非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻分类器(k-nearest neighbor,kNN) (一)非参数方法(Non-param ...
- 在数组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数组从大到小与新数组比较,如 ...
- [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行,最 ...
- 一些简单的问题. 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 ...
- 快速排序/快速查找(第k个, 前k个问题)
//快速排序:Partition分割函数,三数中值分割 bool g_bInvalidInput = false; int median3(int* data, int start, int end) ...
- [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 ...
- [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 ...
- [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 ...
随机推荐
- 迁移学习《Asymmetric Tri-training for Unsupervised Domain Adaptation》
论文信息 论文标题:Asymmetric Tri-training for Unsupervised Domain Adaptation论文作者:Kuniaki Saito, Y. Ushiku, T ...
- day25:7个魔术方法&5个关于类的魔术属性
目录 1.__del__(析构方法) 2.魔术方法:__str__ 3.魔术方法:__repr__ 4.魔术方法:__call__ 5.魔术方法:__bool__ 6.魔术方法:__add__& ...
- 高阶组件——withRouter的原理和用法
作用: 高阶组件中的withRouter, 作用是将一个组件包裹进Route里面, 然后react-router的三个对象history, location, match就会被放进这个组件的props ...
- 【Visual Leak Detector】核心源码剖析(VLD 1.0)
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记.本篇对 VLD 1.0 源码做内存泄漏检测的思路进行剖析.同系列文章目录可见 <内存泄漏检测工具>目录 目录 说明 1. 源码 ...
- GPT护理机器人 - 让护士的工作变简单
引子 书接上文<GPT接入企微应用 - 让工作快乐起来>,我把GPT接入了企微应用,不少同事都开始尝试起来了.有的浅尝辄止,有的刨根问底,五花八门,无所不有.这里摘抄几份: "帮 ...
- 聚合短信PHP代码示例短信接口调用CURL方法
聚合的短信相信大家已经做多了吧,网上的代码看了下就是感觉太繁琐了,不过网上的也是比较好的,用的是post方法,更安全,因我们的项目是在服务器上请求,又绑定了白名单 ,所以弄了个简单点的自己用,参考如下 ...
- npm i 与 npm install 的区别
我们在平时运用的时候一般用 npm i 来代替 npm install(为npm i 的简写) 但是在实际应用中两者是有些不同的(查阅总结): 1.使用npm i 安装的模块和依赖,使用npm uni ...
- 2022-09-30:以下go语言代码输出什么?A: true true false true false; B: true false false true false; C: true true
2022-09-30:以下go语言代码输出什么?A: true true false true false: B: true false false true false: C: true true ...
- 2022-09-02:以下go语言代码输出什么?A:9;B:11;C:编译错误;D:不确定。
2022-09-02:以下go语言代码输出什么?A:9:B:11:C:编译错误:D:不确定. package main import ( "fmt" ) func main() { ...
- 2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。力扣149。
2021-09-03:直线上最多的点数.给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点.求最多有多少个点在同一条直线上.力扣149. 福大大 ...