题解 | #剪绳子(进阶版)# 官方代码+注释
剪绳子(进阶版)
https://www.nowcoder.com/practice/106f666170554379ab1974e5a601e741
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param number long长整型
* @return long长整型
*/
long long mod = 998244353;
// 快速乘法
long long fast(long long x, long long y){
long long res = 0;
x %= mod;
y %= mod;
while(y){
if(y & 1){
//加法代替乘法,防止越界
res += x;
if(res > mod){
res -= mod;
}
}
y = y >> 1;
x = x << 1;
if(x >= mod){
x -= mod;
}
}
return res;
}
// 快速幂
long long Pow(long long x, long long y){
long long res = 1;
// 每次处理一个平方
while(y){
// 如果是指数为奇数则将其转换为偶数的处理逻辑
if(y & 1){
// 将奇数的部分直接乘到结果上,再处理其余偶数的部分
res = fast(res, x);
}
// 叠加
x = fast(x, x);
// 更新y值
y = y >> 1;
}
return res;
}
long long cutRope(long long number) {
// write code here
if(number <= 3){
return number-1;
}
if(number % 3 == 0){
return Pow(3, number / 3);
}else if(number % 3 == 1){
return fast(Pow(3, number / 3 - 1), 4);
}else{
// 最后剩余2的情况
return fast(Pow(3, number / 3), 2);
}
}
};
