首页 > 其他分享 >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]。 请问

时间:2023-06-24 16:00:57浏览次数:43  
标签:last power int 绳子 rest 整数 ans 长度 mod

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;
}

在这里插入图片描述

标签:last,power,int,绳子,rest,整数,ans,长度,mod
From: https://www.cnblogs.com/moonfdd/p/17501215.html

相关文章

  • linux 中shell脚本实现统计每一个read的长度
     001、[root@PC1test02]#lstest.fastq[root@PC1test02]#cattest.fastq##测试fastq数据@SRR8442980.988/2AAGG+:FFF@SRR8442980.988/2AAGGTC+:FFF:,@SRR8442980.1134/1AAAAAAAATATAATTCCA+FFFFFFFFFFFFFFFFFF[root@PC1test02]#awk'{if((NR%......
  • Android 的Margin和Padding属性以及支持的长度单位
    Android的Margin和Padding跟Html的是一样的。如下图所示:黄色部分为Padding,灰色部分为Margin。通俗的理解Padding为内边框,Margin为外边框对应的属性为android:layout_marginBottom="25dip"android:layout_marginLeft="10dip"android:layout_marginTop="10dip"an......
  • 定义一个长度为10 的数组并赋值为0-9
    一、使用Array.applyletarr=Array.apply(null,{length:10}).map((item,index)=>{   returnindex;   });console.log(arr);//(10)[0,1,2,3,4,5,6,7,8,9]//原理:Array.apply的第二个参数是类数组调用Array.apply(null,{length:10})等于生成了长......
  • [Leetcode] 0013. 罗马数字转整数
    13.罗马数字转整数点击上方,跳转至leetcode题目描述罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符数值I1V5X10L50C100D500M1000例如,罗马数字2写......
  • 2023-06-20:给定一个长度为N的数组arr,arr[i]表示宝石的价值 你在某天遇到X价值的宝石, X
    2023-06-20:给定一个长度为N的数组arr,arr[i]表示宝石的价值你在某天遇到X价值的宝石,X价值如果是所有剩余宝石价值中的最小值,你会将该宝石送人X价值如果不是所有剩余宝石价值中的最小值,你会将该宝石放到所有宝石的最后返回把宝石都送人需要多少天比如arr=[3,1,4,3,1,2]在第1......
  • 2023-06-20:给定一个长度为N的数组arr,arr[i]表示宝石的价值 你在某天遇到X价值的宝石, X
    2023-06-20:给定一个长度为N的数组arr,arr[i]表示宝石的价值你在某天遇到X价值的宝石,X价值如果是所有剩余宝石价值中的最小值,你会将该宝石送人X价值如果不是所有剩余宝石价值中的最小值,你会将该宝石放到所有宝石的最后返回把宝石都送人需要多少天比如arr=[3,1,4,3,1,2]在第1天,你遇......
  • 用代码从xml整形数组中取出每个整数以及tabHost使用light主题的问题
    res/values/integers.xml<?xmlversion="1.0"encoding="utf-8"?><resources><integer-arrayname="UserBases"><item>2</item><item>8</item><it......
  • PTA_乙级_1006 换个格式输出整数(C++_模拟)
    让我们用字母B来表示“百”、字母S表示“十”,用12…n来表示不为零的个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。输......
  • 修改表字段长度的操作,对业务是否有影响?
    前两天测试同学问了一个问题,表中某一个字段,需要改一下长度,对业务是否会有影响?可能隐约之中,我们觉得没影响,但又好像有影响,究竟有何影响,我们从实验来看最科学。首先建测试表,NAME字段是VARCHAR2(10),10个字节的字符串类型,表有256万数据。我们将其长度改为20,从执行时间看,只有20毫秒,我们......
  • 最大安全整数
    在JavaScript中,最大安全整数是2^53-1,即9007199254740991。这是因为在JavaScript中,整数和浮点数的存储方式是一样的,都是采用IEEE754双精度浮点数表示,但整数必须存储在53位之内。超出最大安全整数范围的数字将无法被准确表示,可能会发生误差,因此在进行大数计算时需要注意精......