剣はオファーを指します-------ロープを切ります

ここに画像の説明を挿入
トピックリンク!

アイデア:この
質問は数学的な証明の質問です。もちろん、それを理解するのは簡単です。貪欲な思考でそれを行うと、次の推論を知ることができます。ロープが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;
};

おすすめ

転載: blog.csdn.net/weixin_43743711/article/details/115080741