剑指 Offer 14- II. 剪绳子 II
思路:数学推导+快速幂求余
大数越界:当a增大时,最后返回的结果超出int32的取值范围
解决方案:快速幂求余
( x y ) % p = [ ( x % p ) ( y % p ) ] % p (xy)\% p=[(x\% p)(y\% p)]\% p (xy)%p=[(x%p)(y%p)]%p
快速幂求余:
- 根据求余运算性质可推出:
x a % p = { ( x 2 % p ) a / / 2 % p a % 2 = = 0 [ ( x % p ) ( x a − 1 % p ) ] % p = [ x ( x 2 % p ) a / / 2 ] % p a % 2 = = 1 x^a\%p= \begin{cases} (x^2\%p)^{a//2}\%p & a\%2==0\\ [(x\%p)(x^{a-1}\%p)]\%p=[x(x^2\%p)^{a//2}]\%p & a\%2==1 \end{cases} xa%p={(x2%p)a//2%p[(x%p)(xa−1%p)]%p=[x(x2%p)a//2]%pa%2==0a%2==1
class Solution {
public:
const int N=1e9+7;
int cuttingRope(int n) {
if(n<4) return n-1;
int b=n%3;
long rem=1,x=3;
for(int a=n/3-1;a>0;a/=2){
if(a%2==1) rem=(rem*x)%N;
x=(x*x)%N;
}
if(b==0) return (int)(rem*3%N);
if(b==1) return (int)(rem*4%N);
return (int)(rem*6%N);
}
};
时间复杂度 O( l o g 2 n log_2n log2n)
空间复杂度 O(1)