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