class Solution {
public int cuttingBamboo(int bamboo_len) {
if (bamboo_len <= 3)
return bamboo_len - 1;
int a = bamboo_len / 3;
int b = bamboo_len % 3;
long result = 1;
if (b == 0) {
for (int i = 0; i < a; i++) {
result = (result * 3) % 1000000007;
}
} else if (b == 1) {
for (int i = 0; i < a - 1; i++) {
result = (result * 3) % 1000000007;
}
result = (result * 4) % 1000000007;
} else {
for (int i = 0; i < a; i++) {
result = (result * 3) % 1000000007;
}
result = (result * 2) % 1000000007;
}
return (int) result;
}
}
class Solution {
public:
int cuttingBamboo(int bamboo_len) {
int c = 1000000007;
if (bamboo_len <= 3) {
return bamboo_len -1;
}
int a = bamboo_len / 3;
int b = bamboo_len % 3;
if (b == 0) {
return pow(3, a, c);
}
else if (b == 1) {
return (pow(3, a-1, c) * 4) % c;
}else {
return (pow(3, a, c) * 2) % c;
}
}
long pow (int a, int b, int c) {
long A = 1;
long T = a % c;
while (b != 0) {
if ((b & 1) == 1) {
A = (A * T) % c;
}
b >>= 1;
T = (T * T) % c;
}
return A;
}
};
class Solution {
public int cuttingBamboo(int bamboo_len) {
int MOD=1000000007;
if(bamboo_len<=3) return bamboo_len-1;
long result=1;
while(bamboo_len>4){
result=(result*3)%MOD;
bamboo_len-=3;
}
result=(result*bamboo_len)%MOD;
return (int) result;
}
}
class Solution {
public int cuttingBamboo(int bamboo_len) {
if (bamboo_len <= 3) {
return bamboo_len - 1;
}
int a = bamboo_len / 3, b = bamboo_len % 3;
int mod = 1000000007;
if (b == 0) {
return (int) (pow(3, a, mod) % mod);
}else if (b == 1){
return (int) (pow(3, a - 1, mod) * 4 % mod);
}
return (int) (pow(3, a, mod) * 2 % mod);
}
private long pow1(int n, int x, int mod) {
long res = 1;
for(int i = 0; i < x; i++) {
res = (res * n) % mod;
}
return res;
}
private long pow(long n, int x, int mod) {
long res = 1;
while (x != 0) {
if ((x & 1) == 1) {
res = (res * n) % mod;
}
n = (n * n) % mod;
x >>= 1;
}
return res;
}
}
class Solution {
public:
// 思路:涉及多个数相乘时如何取余
// (x1 * x2) % m = (x1 % m * x2 % m) % m
int cuttingBamboo(int bamboo_len) {
if(bamboo_len <= 2) return 1;
else if(bamboo_len == 3) return 2;
int res = bamboo_len / 3;
int mod = bamboo_len % 3;
long m = 1000000007; // 取模 1000000007
if(mod == 0) return (int) pow_mod(3, res, m);
else if(mod == 1) return (int)(pow_mod(3, res - 1, m) * 4 % m);
else if(mod == 2) return (int)(pow_mod(3, res, m) * 2 % m);
return -1;
}
long pow_mod(int a, int x,long m){
long res = 1;
for(int i = 0; i < x;i ++)
res = (res * a) % m;
return res;
}
// o(n) o(1)
};
共以下 9 个回答
跟上题一样,但是换成遍历求乘积,边乘边模
时间复杂度O(n)
空间复杂度O(1)
解题思路
– 在上面一题的基础上,但是我们不能把最后的结果拿去取模,因为结果太大了,因而我们需要在pow的过程中对中间结果进行取模。
– x^a % p =[(x^(a-1) % p)* (x % p)] % p ,当x<p时成立。其中如果x<p,x%p=x
– 简化之后, Fa = [(F(a-1) * x % p ]% p ,比如我们要求 x^a % p的,只需要从x^1,即3开始按照循环去叠加即可
【题解1】
采用快速幂取余法,思路为将幂指数b拆分为b02^0+b12^1+……,发现结果An=(An-1(a^bn^2n)%c)%c。令Tn=(a^bn^2n)%c,发现Tn=(Tn-1Tn-1)%c。顾可以采用递推公式计算大数取余结果。
时间复杂度O(longN),空间复杂度O(1)。
在第一题的基础上加入大数取模 关键是发现3是最优段
On o1
每一步取余,最后还要再取一次余
思路:直接采用三等分思路
时间复杂度:O(logn).
空间复杂度:O(1)
class Solution {
public int cuttingBamboo(int bamboo_len) {
int MOD = 1000000007;
}