题解 | #剪绳子(进阶版)#

剪绳子(进阶版)

https://www.nowcoder.com/practice/106f666170554379ab1974e5a601e741?tpId=265&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3FjudgeStatus%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D13%26type%3D265&difficulty=&judgeStatus=3&tags=&title=&gioEnter=menu

学到了,二分求乘和幂

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param number long长整型 
     * @return long长整型
     */
  long long mod = 998244353;
  
    long long cutRope(long long number) {
      if (number <= 3) {
        return number - 1;
      } else if (number % 3 == 0) {
        // 刚好整除
        return pow(3, number / 3);
      } else if (number % 3 == 1) {
        //  剩下一则取出一个3凑成4
        return fast(pow(3, number / 3 - 1), 4);
      } else {
        //  剩下2直接相乘
        return fast(pow(3, number / 3), 2);
      }
    }
  
  long long fast(long long a, long long b) {
    long long res = 0;
    
    a %= mod;
    b %= mod;
    
    while (b) {
      if (b & 1) {
        //  累积的奇数和加上偶数和,最后为1一定会两者相加
        res += a;
        if (res >= mod) {
          res -= mod;
        }
      }
      
      b >>= 1;
      //  a+a = a*2 = a<<1
      a <<= 1;
      
      if (a >= mod) {
        a -= mod;
      }
    }
    
    return res;
  }
  
  long long pow(long long a, long long b) {
    long long res = 1;
    
    while (b) {
      if (b & 1) {
        res = fast(res, a);
      }
      
      a = fast(a, a);
      b >>= 1;
    }
    
    return res;
  }
};
全部评论

相关推荐

2025-12-19 15:04
门头沟学院 Java
小肥罗:hr爱上你了,你负责吗哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务