剑指offer JZ83 剪绳子(进阶版)
描述
剑指offer JZ83 剪绳子(进阶版)
给你一根长度为 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 取模。
前置思路数学原理:
图片截取于牛客题解官题解思路
方法一:快速幂法
思路:由于我们知道运算规则,只需要分三种情况:1.长度除以3余数为0。 2.长度除以3余数为1。 3.长度除以3余数为2.。三种情况分别求解即可。但是由于数字过大,如果直接用Math.pow()进行幂运算的话,会导致运超时。所以我们需要一个新的方法来进行幂运算。
快速幂运算原理:比如我们需要求3的5次幂,我们可以将5看作二进制数101,那么容易看出来,第几次位上有1,就代表3的几次幂,最后将各个位数的结果相乘得到最终结果。比如3的5次幂是243,我们使用快速幂法,101的第一位有1,得出1乘以3的1次幂;101第二位上为0,得出0
代码实现与相应解释说明:
1 | import java.util.*; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 DreamFire!