原题链接:https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/
相关题目:剪绳子
1、循环求余法
//(x ^ a) % p;
long remainder(int x, int a, int mod) {
long rem = 1;
for (int i = 1; i < a; i++) {//少计算一次,以便后续处理
rem = (rem * x) % mod;
}
return rem;
}
int cuttingRope(int n) {
if (n <= 3) return n - 1;
int a = n / 3, b = n % 3, mod = 1000000007, x = 3;
long rem = remainder(x, a, mod);
if (b == 0) return (int)(rem * 3 % mod);
if (b == 1) return (int)(rem * 4 % mod);
return (int)(rem * 6 % mod);
}
2、快速求幂法
//(x ^ a) % mod
int remainder(int x, int a, int mod) {
int rem = 1;
long b = x;
while(a) {
if (a & 1) rem = (rem * b) % mod;
b = (b * b) % mod;
a >>= 1;
}
return rem;
}
int cuttingRope(int n) {
if (n <= 3) return n - 1;
int a = n / 3 - 1, b = n % 3, mod = 1000000007, x = 3;//a少乘一次,为后续做处理
long rem = remainder(x, a, mod);
if (b == 0) return (int)(rem * 3 % mod);
if (b == 1) return (int)(rem * 4 % mod);
return (int)(rem * 6 % mod);
}