学到了,二分求乘和幂

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;
  }
};