Idea: Esta
pregunta es una pregunta de prueba matemática. Por supuesto, es fácil de resolver. Si lo hace con un pensamiento codicioso, podemos conocer esta inferencia: cuando la cuerda se divide en varias secciones con una longitud de 3 más como sea posible, el producto es el más grande. Entonces, si hay un resto, si es 2, no hay necesidad de dividir, si es 1, entonces un 3 más este 1 debe dividirse en 2 + 2.
¡Haga clic aquí para obtener una prueba específica!
Código:
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;
}
};
Idea: No
hay diferencia entre esta pregunta y la pregunta anterior. Utiliza principalmente exponenciación rápida y plantillas de producto rápidas.
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;
};