Espada se refiere a Oferta ------- Cortar la cuerda

Inserte la descripción de la imagen aquí
Enlace de tema!

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;
    }
};


Inserte la descripción de la imagen aquí

Enlace de tema!

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;
};

Supongo que te gusta

Origin blog.csdn.net/weixin_43743711/article/details/115080741
Recomendado
Clasificación