思路:
这道题是个数学证明题,当然也是很容易就能想得出,用贪心的思维去做,我们可以知道这个推论:尽可能将绳子以长度 3 等分为多段时,乘积最大。 那么就会有余数的情况下,如果为2则不用拆分,如果为1的话,那么就要把一个3加上这个1拆分成2+2。
具体证明点击此处!
代码:
class Solution {
public:
int cuttingRope(int n) {
if(n==2) return 1;
if(n==3) return 2;
int sum_3 = n / 3;
int mod = n%3;
int sum_2 = 0;
if(mod==1){
sum_3-=1;
sum_2+=2;
}else if(mod==2){
sum_2+=1;
}
int sum = 1;
while(sum_3--){
sum*=3;
}
while(sum_2--){
sum*=2;
}
return sum;
}
};
思路:
这道题的话跟上道题没什么区别,主要用的是快速幂以及快速积的模板即可。
class Solution {
public:
int cuttingRope(int n) {
if(n==2) return 1;
if(n==3) return 2;
int sum_3 = n / 3;
int mod = n%3;
int sum_2 = 0;
if(mod==1){
sum_3-=1;
sum_2+=2;
}else if(mod==2){
sum_2+=1;
}
int sum = 1;
func_mi(sum,3,sum_3);
int SUM = 1;
func_mi(SUM,2,sum_2);
return func_MUL(sum,SUM);
}
void func_mi(int& sum,int bk,int len){
while(len){
if(len&1) sum = func_MUL(sum,bk); //sum = sum*bk;
bk = func_MUL(bk,bk);
//bk<<=1;
len>>=1;
}
return ;
}
int func_MUL(int a,int b){
int sum = 0;
while(b){
if(b&1) sum = (sum+a)%MOD;
a = (a+a)%MOD;
b >>= 1;
}
return sum%MOD;
}
private:
int MOD = 1e9+7;
};