• f(2) = 1, f(3) = 2, f(4) = 4...
  • 当n >= 4时, f(n) >= n 所以结果应该用2、3乘积表示
  • 证明:f(n) = f(n - m) * m 当 m 大于 3 时, m <= f(m)
  • 因此f(n) = 3 ^ x * 2 ^ y
  • n % 3 = 0, x = n / 3,y = 0
  • n % 3 = 1, x = n / 3 - 1, y = 2
  • n % 3 = 2, x = n / 3, y = 1
public:
    long long M = 998244353;
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param number long长整型 
     * @return long长整型
     */
    // return num ^ x
    long long myPow(long long num, long long x) {
        long long ans = 1;
        while (x) {
            if (x & 1)
                ans = ans * num % M;
            num = num * num % M;
            x >>= 1;
        }
        return ans;
    }
    long long cutRope(long long number) {
        // write code here
        if (number <= 3)
            return number - 1;
        
        long long num_3 = number / 3;
        int num_2;
        if (number % 3 == 0)
            num_2 = 1;
        else if (number % 3 == 1) {
            --num_3;
            num_2 = 4;
        } 
        else 
            num_2 = 2;
        
        long long ret = myPow(3, num_3) % M;
        return (ret * num_2) % M;
    }
};