2020年12月4日 周五天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
这道题主体和 剑指offer 14. 剪绳子 一样,唯一不同的就是本题涉及到大数越界情况下的取余问题。
class Solution {
public:
int cuttingRope(int n) {
if (n <= 3) return n - 1;
int a = n / 3, b = n % 3, ans = 0, mod = 1000000007;
if (b == 0) ans = Pow(3, a, mod);
else if (b == 1) ans = Pow(3, a - 1, mod) * 4 % mod; // *4后的结果可能大于mod,因此需要再次取余
else ans = Pow(3, a, mod) * 2 % mod;
return ans;
}
// 快速幂算法,对 1000000007 取余
long long Pow(long long base, long long power, int mod){
long long res = 1;
while(power != 0){
if(power&1)
res = res * base % mod;
power >>= 1;
base = base * base % mod;
}
return res;
}
};
这里使用的是快速幂算法,具体参考了这篇文章 快速幂算法(全网最详细地带你从零开始一步一步优化)。
参考文献
快速幂算法(全网最详细地带你从零开始一步一步优化)
《剑指offer 第二版》