ソードフィンガーオファー14-II。カットザロープII(C ++)貪欲+高速パワー

これが長さnのロープです。ロープを整数の長さのm個のセグメントに切断してください(mとnは整数、n> 1とm> 1)。各ロープの長さはk [0]、k [1です。 ] ... k [m-1]。k [0] k [1] …* k [m-1]の可能な最大の積は何ですか?たとえば、ロープの長さが8の場合、2、3、3の長さで3つに切断します。この時点で得られる最大の積は18です。

答えは1e9 + 7(1000000007)を法とする必要があります。計算の初期結果が1000000008の場合は、1を返します。
オファー14-Iよりも残りを見つける

例1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

例2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

促す:

2 <= n <= 1000
注:この質問は、メインのWebサイトの質問343と同じです:https://leetcode-cn.com/problems/integer-break/

class Solution {
    
    
public:
    int cuttingRope(int n) {
    
    
		if (n <= 3) return n - 1;
        int b = n % 3, p = 1000000007;
        long rem = 1, x = 3;
		
		//下面为快速幂方法,其中多了求余数部分, 
		//  n / 3 - 1是为了留出来一个“3”,
        for (int a = n / 3 - 1; a > 0; a /=2 ) {
    
    
            if ((a & 1) == 1) {
    
    
                rem = (rem * x) % p;
            }
            x = (x * x) % p;
        }

        if (b == 0) return (int) (rem * 3 % p);//3就是快速幂留出来的3
        if (b == 1) return (int) (rem * 4 % p);//4就是3+1,因为相乘所以4等于2*2
        return (int) (rem * 6 % p);6就是3+2那一段绳子,因为相乘所以6等于3*2
    }
};

ここに画像の説明を挿入します

多数の残り:

ここに画像の説明を挿入します

著者:jyd
リンク:https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/solution/mian-shi-ti-14-ii-jian-sheng-zi-iitan-xin-er -fen-f /
出典:LeetCode(LeetCode)の
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。

おすすめ

転載: blog.csdn.net/qq_30457077/article/details/114736618