首页 > 试题广场 >

剪绳子(进阶版)

[编程题]剪绳子(进阶版)
  • 热度指数:26397 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m <= n ),每段绳子的长度记为 k[1],...,k[m] 。请问 k[1]*k[2]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18 。

由于答案过大,请对 998244353 取模。

数据范围:
进阶:空间复杂度 O(1) , 时间复杂度 O(logn)

示例1

输入

4

输出

4

说明

拆分成 2 个长度为 2 的绳子,2 * 2 = 4 
示例2

输入

5

输出

6

说明

剪成一个长度为 2 的绳子和一个长度为 3 的绳子,答案为2*3=6 
示例3

输入

874520

输出

908070737
# -*- coding: utf-8 -*-


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param number long长整型
# @return long长整型
#
class Solution:
    """
    题目:
        NC287 剪绳子(进阶版)
        https://www.nowcoder.com/practice/106f666170554379ab1974e5a601e741?tpId=196&tqId=39738&rp=1&ru=/ta/job-code-total&qru=/ta/job-code-total&difficulty=&judgeStatus=&tags=/question-ranking
    借鉴:
        大神:妙蛙种子呱呱呱、牛客736356489号
    算法:
        贪心算法
        当number <= 3,直接返回number - 1
        当number == 4时,返回4
        当number >= 5时,能取3先取3,当小于5时,直接取该数
        这里需要注意的是:
            当number很大时,如果使用如下循环,容易超时。这里考察的另一个知识点就是快速幂运算。
            # while number > 4: # 这里需要使用快速幂运算,不然超时
            #     res = (res * 3) % MOD
            #     number -= 3
            # return res * number % MOD
    复杂度:
        时间复杂度:O(logN)
        空间复杂度:O(1)
    """

    def cutRope(self, number):
        # write code here
        def fastPow_rec(x, n): # 递归法
            if n == 0:
                return 1
            elif n == 1:
                return x
            else:
                part = fastPow_rec(x, n / 2) % MOD
                if n % 2 == 0:
                    ans = part * part % MOD
                else:
                    ans = part * part * x % MOD
                return ans

        def fastPow_ite(x, n): # 迭代法
            if n == 0:
                return 1
            elif n == 1:
                return x
            else:
                ans = 1
                while n > 0:
                    if n % 2 == 1:
                        ans *= x % MOD
                    x = x ** 2 % MOD
                    n /= 2
                return ans

        if number <= 3:
            return number - 1
        elif number == 4:
            return 4
        else:
            res, MOD = 1, 998244353
            cnt = number / 3
            if number % 3 == 0:
                res = fastPow_ite(3, cnt) % MOD
            elif number % 3 == 1:
                res = fastPow_ite(3, cnt - 1) * 4 % MOD
            else:  # number % 3 == 2
                res = fastPow_ite(3, cnt) * 2 % MOD
            return res


if __name__ == '__main__':
    s = Solution()

    # n = 4

    # n = 5

    # n = 874520

    n = 999999999

    res = s.cutRope(n)

    print res

发表于 2022-07-06 14:10:12 回复(0)