要求:剪成m段,最大乘积,要取模
思路:不能取模,只能贪心。
贪心:平均分剪成3段乘积最大,推导见力扣上的题解。根据贪心,能整除则全3,余1的话要把最后一个4拆成2*2,余2的话乘上即可。要快速幂取模,原理是n为偶数则a的n拆为a的平方取模的n/2次方,奇数再则乘a
class Solution {
public:
long fastmod(int p){
if(p==0)return 1;
long res=3;
long rest=1;
while(p>1){
if(p&1){
rest=(res*rest)%1000000007;
res=(res*res)%1000000007;
p=(p-1)/2;
}
else {
res=(res%1000000007)*(res%1000000007)%1000000007;
p=p/2;
}
}
return (res*rest)%1000000007;
}
int cuttingRope(int n) {
if(n<=3)return n-1;
long ans;
switch(n%3){
case 0:{
ans=fastmod(n/3)%1000000007;
break;
}
case 1:{
ans=(4*fastmod((n-4)/3))%1000000007;
break;
}
case 2:{
ans=(2*fastmod((n-2)/3))%1000000007;
break;
}
}
return ans;
}
};