diff --git "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/README.md" "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/README.md" index d047ceeb8016a..70ac2b0a1d527 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/README.md" +++ "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/README.md" @@ -1,4 +1,4 @@ -# [面试题 14- II. 剪绳子 II](这里是题目链接,如:https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/) +# [面试题 14- II. 剪绳子 II](https://leetcode.cn/problems/jian-sheng-zi-ii-lcof/) ## 题目描述 @@ -36,7 +36,7 @@ 当 $n \lt 4$,此时 $n$ 不能拆分成至少两个正整数的和,因此 $n - 1$ 是最大乘积。当 $n \ge 4$ 时,我们尽可能多地拆分 $3$,当剩下的最后一段为 $4$ 时,我们将其拆分为 $2 + 2$,这样乘积最大。 -时间复杂度 $O(1)$,空间复杂度 $O(1)$。 +时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。 @@ -59,30 +59,30 @@ class Solution: ```java class Solution { + private final int mod = (int) 1e9 + 7; + public int cuttingRope(int n) { if (n < 4) { return n - 1; } - final int mod = (int) 1e9 + 7; if (n % 3 == 0) { - return (int) qmi(3, n / 3, mod); + return qpow(3, n / 3); } if (n % 3 == 1) { - return (int) (qmi(3, n / 3 - 1, mod) * 4 % mod); + return (int) (4L * qpow(3, n / 3 - 1) % mod); } - return (int) (qmi(3, n / 3, mod) * 2 % mod); + return 2 * qpow(3, n / 3) % mod; } - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + private int qpow(long a, long n) { + long ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a % mod; } - k >>= 1; - a = a * a % p; + a = a * a % mod; } - return res; + return (int) ans; } } ``` @@ -97,53 +97,24 @@ public: return n - 1; } const int mod = 1e9 + 7; + auto qpow = [&](long long a, long long n) { + long long ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return (int) ans; + }; if (n % 3 == 0) { - return qmi(3, n / 3, mod); + return qpow(3, n / 3); } if (n % 3 == 1) { - return qmi(3, n / 3 - 1, mod) * 4 % mod; - } - return qmi(3, n / 3, mod) * 2 % mod; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; - } - k >>= 1; - a = a * a % p; - } - return res; - } -}; -``` - -### **JavaScript** - -```js -/** - * @param {number} n - * @return {number} - */ -var cuttingRope = function (n) { - if (n <= 3) return n - 1; - let a = ~~(n / 3); - let b = n % 3; - const MOD = 1e9 + 7; - function myPow(x) { - let r = 1; - for (let i = 0; i < x; i++) { - r = (r * 3) % MOD; + return qpow(3, n / 3 - 1) * 4L % mod; } - return r; - } - if (b === 1) { - return (myPow(a - 1) * 4) % MOD; + return qpow(3, n / 3) * 2 % mod; } - if (b === 0) return myPow(a) % MOD; - return (myPow(a) * 2) % MOD; }; ``` @@ -155,26 +126,57 @@ func cuttingRope(n int) int { return n - 1 } const mod = 1e9 + 7 + qpow := func(a, n int) int { + ans := 1 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans = ans * a % mod + } + a = a * a % mod + } + return ans + } if n%3 == 0 { - return qmi(3, n/3, mod) + return qpow(3, n/3) } if n%3 == 1 { - return qmi(3, n/3-1, mod) * 4 % mod + return qpow(3, n/3-1) * 4 % mod } - return qmi(3, n/3, mod) * 2 % mod + return qpow(3, n/3) * 2 % mod } +``` -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p - } - k >>= 1 - a = a * a % p - } - return res -} +### **JavaScript** + +```js +/** + * @param {number} n + * @return {number} + */ +var cuttingRope = function (n) { + if (n < 4) { + return n - 1; + } + const mod = 1e9 + 7; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = Number((BigInt(ans) * BigInt(a)) % BigInt(mod)); + } + a = Number((BigInt(a) * BigInt(a)) % BigInt(mod)); + } + return ans; + }; + const k = Math.floor(n / 3); + if (n % 3 === 0) { + return qpow(3, k); + } + if (n % 3 === 1) { + return (4 * qpow(3, k - 1)) % mod; + } + return (2 * qpow(3, k)) % mod; +}; ``` ### **Rust** diff --git "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.cpp" "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.cpp" index 05b96bc87b4cb..530e2c14d7abc 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.cpp" +++ "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.cpp" @@ -1,28 +1,26 @@ -class Solution { -public: - int cuttingRope(int n) { - if (n < 4) { - return n - 1; - } - const int mod = 1e9 + 7; - if (n % 3 == 0) { - return qmi(3, n / 3, mod); - } - if (n % 3 == 1) { - return qmi(3, n / 3 - 1, mod) * 4 % mod; - } - return qmi(3, n / 3, mod) * 2 % mod; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; - } - k >>= 1; - a = a * a % p; - } - return res; - } +class Solution { +public: + int cuttingRope(int n) { + if (n < 4) { + return n - 1; + } + const int mod = 1e9 + 7; + auto qpow = [&](long long a, long long n) { + long long ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return (int) ans; + }; + if (n % 3 == 0) { + return qpow(3, n / 3); + } + if (n % 3 == 1) { + return qpow(3, n / 3 - 1) * 4L % mod; + } + return qpow(3, n / 3) * 2 % mod; + } }; \ No newline at end of file diff --git "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.go" "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.go" index 95f4022fd411f..e0737790e5835 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.go" +++ "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.go" @@ -3,23 +3,21 @@ func cuttingRope(n int) int { return n - 1 } const mod = 1e9 + 7 + qpow := func(a, n int) int { + ans := 1 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans = ans * a % mod + } + a = a * a % mod + } + return ans + } if n%3 == 0 { - return qmi(3, n/3, mod) + return qpow(3, n/3) } if n%3 == 1 { - return qmi(3, n/3-1, mod) * 4 % mod - } - return qmi(3, n/3, mod) * 2 % mod -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p - } - k >>= 1 - a = a * a % p + return qpow(3, n/3-1) * 4 % mod } - return res + return qpow(3, n/3) * 2 % mod } \ No newline at end of file diff --git "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.java" "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.java" index 22718329f02fb..45a5ee4e6607d 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.java" +++ "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.java" @@ -1,27 +1,27 @@ -class Solution { - public int cuttingRope(int n) { - if (n < 4) { - return n - 1; - } - final int mod = (int) 1e9 + 7; - if (n % 3 == 0) { - return (int) qmi(3, n / 3, mod); - } - if (n % 3 == 1) { - return (int) (qmi(3, n / 3 - 1, mod) * 4 % mod); - } - return (int) (qmi(3, n / 3, mod) * 2 % mod); - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; - } - k >>= 1; - a = a * a % p; - } - return res; - } +class Solution { + private final int mod = (int) 1e9 + 7; + + public int cuttingRope(int n) { + if (n < 4) { + return n - 1; + } + if (n % 3 == 0) { + return qpow(3, n / 3); + } + if (n % 3 == 1) { + return (int) (4L * qpow(3, n / 3 - 1) % mod); + } + return 2 * qpow(3, n / 3) % mod; + } + + private int qpow(long a, long n) { + long ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return (int) ans; + } } \ No newline at end of file diff --git "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.js" "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.js" index f6de7b68538bf..4db52300f6a15 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.js" +++ "b/lcof/\351\235\242\350\257\225\351\242\23014- II. \345\211\252\347\273\263\345\255\220 II/Solution.js" @@ -3,20 +3,26 @@ * @return {number} */ var cuttingRope = function (n) { - if (n <= 3) return n - 1; - let a = ~~(n / 3); - let b = n % 3; - const MOD = 1e9 + 7; - function myPow(x) { - let r = 1; - for (let i = 0; i < x; i++) { - r = (r * 3) % MOD; + if (n < 4) { + return n - 1; + } + const mod = 1e9 + 7; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = Number((BigInt(ans) * BigInt(a)) % BigInt(mod)); + } + a = Number((BigInt(a) * BigInt(a)) % BigInt(mod)); } - return r; + return ans; + }; + const k = Math.floor(n / 3); + if (n % 3 === 0) { + return qpow(3, k); } - if (b === 1) { - return (myPow(a - 1) * 4) % MOD; + if (n % 3 === 1) { + return (4 * qpow(3, k - 1)) % mod; } - if (b === 0) return myPow(a) % MOD; - return (myPow(a) * 2) % MOD; + return (2 * qpow(3, k)) % mod; }; diff --git "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/README.md" "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/README.md" index ed7b05ccad8d0..c2e9c0289a070 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/README.md" +++ "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/README.md" @@ -59,16 +59,16 @@ ```python class Solution: def myPow(self, x: float, n: int) -> float: - def qmi(a, k): - res = 1 - while k: - if k & 1: - res *= a + def qpow(a: float, n: int) -> float: + ans = 1 + while n: + if n & 1: + ans *= a a *= a - k >>= 1 - return res + n >>= 1 + return ans - return qmi(x, n) if n >= 0 else 1 / qmi(x, -n) + return qpow(x, n) if n >= 0 else 1 / qpow(x, -n) ``` ### **Java** @@ -78,20 +78,18 @@ class Solution: ```java class Solution { public double myPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long) n); } - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a; } - a *= a; - k >>= 1; + a = a * a; } - return res; + return ans; } } ``` @@ -102,20 +100,17 @@ class Solution { class Solution { public: double myPow(double x, int n) { - long long N = n; - return N >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); - } - - double qmi(double a, long long k) { - double res = 1; - while (k) { - if (k & 1) { - res *= a; + auto qpow = [](double a, long long n) { + double ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>= 1; - } - return res; + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long long) n); } }; ``` @@ -124,22 +119,20 @@ public: ```go func myPow(x float64, n int) float64 { - if n >= 0 { - return qmi(x, n) - } - return 1.0 / qmi(x, -n) -} - -func qmi(a float64, k int) float64 { - var res float64 = 1 - for k != 0 { - if k&1 == 1 { - res *= a + qpow := func(a float64, n int) float64 { + ans := 1.0 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans *= a + } + a *= a } - a *= a - k >>= 1 + return ans + } + if n >= 0 { + return qpow(x, n) } - return res + return 1 / qpow(x, -n) } ``` @@ -152,39 +145,35 @@ func qmi(a float64, k int) float64 { * @return {number} */ var myPow = function (x, n) { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -}; - -function qmi(a, k) { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; -} + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); +}; ``` ### **TypeScript** ```ts function myPow(x: number, n: number): number { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -} - -function qmi(a: number, k: number): number { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a: number, n: number): number => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); } ``` @@ -193,20 +182,49 @@ function qmi(a: number, k: number): number { ```cs public class Solution { public double MyPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); + return n >= 0 ? qpow(x, n) : 1.0 / qpow(x, -(long)n); } - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans *= a; } a *= a; - k >>= 1; } - return res; + return ans; + } +} +``` + +### **Rust** + +```rust +impl Solution { + #[allow(dead_code)] + pub fn my_pow(x: f64, n: i32) -> f64 { + let mut x = x; + let n = n as i64; + if n >= 0 { + Self::quick_pow(&mut x, n) + } else { + 1.0 / Self::quick_pow(&mut x, -n) + } + } + + #[allow(dead_code)] + fn quick_pow(x: &mut f64, mut n: i64) -> f64 { + // `n` should greater or equal to zero + let mut ret = 1.0; + while n != 0 { + if n & 0x1 == 1 { + ret *= *x; + } + *x *= *x; + n >>= 1; + } + ret } } ``` diff --git "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.cpp" "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.cpp" index 6659ae4d24c2b..352fcf7bea155 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.cpp" +++ "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.cpp" @@ -1,19 +1,16 @@ -class Solution { -public: - double myPow(double x, int n) { - long long N = n; - return N >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); - } - - double qmi(double a, long long k) { - double res = 1; - while (k) { - if (k & 1) { - res *= a; - } - a *= a; - k >>= 1; - } - return res; - } +class Solution { +public: + double myPow(double x, int n) { + auto qpow = [](double a, long long n) { + double ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; + } + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long long) n); + } }; \ No newline at end of file diff --git "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.cs" "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.cs" index 09405460bc5df..93f0cd8681a88 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.cs" +++ "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.cs" @@ -1,18 +1,16 @@ public class Solution { public double MyPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); + return n >= 0 ? qpow(x, n) : 1.0 / qpow(x, -(long)n); } - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans *= a; } a *= a; - k >>= 1; } - return res; + return ans; } } \ No newline at end of file diff --git "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.go" "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.go" index 714071b90fae5..1f714843d7f49 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.go" +++ "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.go" @@ -1,18 +1,16 @@ func myPow(x float64, n int) float64 { - if n >= 0 { - return qmi(x, n) - } - return 1.0 / qmi(x, -n) -} - -func qmi(a float64, k int) float64 { - var res float64 = 1 - for k != 0 { - if k&1 == 1 { - res *= a + qpow := func(a float64, n int) float64 { + ans := 1.0 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans *= a + } + a *= a } - a *= a - k >>= 1 + return ans + } + if n >= 0 { + return qpow(x, n) } - return res + return 1 / qpow(x, -n) } \ No newline at end of file diff --git "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.java" "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.java" index 1e399983dcf9a..efa1dc56dd04d 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.java" +++ "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.java" @@ -1,18 +1,16 @@ -class Solution { - public double myPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); - } - - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; - } - a *= a; - k >>= 1; - } - return res; - } +class Solution { + public double myPow(double x, int n) { + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long) n); + } + + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a; + } + a = a * a; + } + return ans; + } } \ No newline at end of file diff --git "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.js" "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.js" index 752ec5e7649bf..cd6d1323b2b6b 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.js" +++ "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.js" @@ -4,17 +4,15 @@ * @return {number} */ var myPow = function (x, n) { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -}; - -function qmi(a, k) { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; -} + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); +}; diff --git "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.py" "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.py" index 2e216312d422c..94981abc703d4 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.py" +++ "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.py" @@ -1,12 +1,12 @@ -class Solution: - def myPow(self, x: float, n: int) -> float: - def qmi(a, k): - res = 1 - while k: - if k & 1: - res *= a - a *= a - k >>= 1 - return res - - return qmi(x, n) if n >= 0 else 1 / qmi(x, -n) +class Solution: + def myPow(self, x: float, n: int) -> float: + def qpow(a: float, n: int) -> float: + ans = 1 + while n: + if n & 1: + ans *= a + a *= a + n >>= 1 + return ans + + return qpow(x, n) if n >= 0 else 1 / qpow(x, -n) diff --git "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.rs" "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.rs" new file mode 100644 index 0000000000000..732a8d14260af --- /dev/null +++ "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.rs" @@ -0,0 +1,26 @@ +impl Solution { + #[allow(dead_code)] + pub fn my_pow(x: f64, n: i32) -> f64 { + let mut x = x; + let n = n as i64; + if n >= 0 { + Self::quick_pow(&mut x, n) + } else { + 1.0 / Self::quick_pow(&mut x, -n) + } + } + + #[allow(dead_code)] + fn quick_pow(x: &mut f64, mut n: i64) -> f64 { + // `n` should greater or equal to zero + let mut ret = 1.0; + while n != 0 { + if n & 0x1 == 1 { + ret *= *x; + } + *x *= *x; + n >>= 1; + } + ret + } +} \ No newline at end of file diff --git "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.ts" "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.ts" index 9afc6c919d6f8..96fc09a5ff70c 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.ts" +++ "b/lcof/\351\235\242\350\257\225\351\242\23016. \346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271/Solution.ts" @@ -1,15 +1,13 @@ function myPow(x: number, n: number): number { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -} - -function qmi(a: number, k: number): number { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a: number, n: number): number => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); } diff --git a/solution/0000-0099/0050.Pow(x, n)/README.md b/solution/0000-0099/0050.Pow(x, n)/README.md index 36940e8b5603a..16604d3a7552b 100644 --- a/solution/0000-0099/0050.Pow(x, n)/README.md +++ b/solution/0000-0099/0050.Pow(x, n)/README.md @@ -63,16 +63,16 @@ ```python class Solution: def myPow(self, x: float, n: int) -> float: - def qmi(a, k): - res = 1 - while k: - if k & 1: - res *= a + def qpow(a: float, n: int) -> float: + ans = 1 + while n: + if n & 1: + ans *= a a *= a - k >>= 1 - return res + n >>= 1 + return ans - return qmi(x, n) if n >= 0 else 1 / qmi(x, -n) + return qpow(x, n) if n >= 0 else 1 / qpow(x, -n) ``` ### **Java** @@ -82,20 +82,18 @@ class Solution: ```java class Solution { public double myPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long) n); } - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a; } - a *= a; - k >>= 1; + a = a * a; } - return res; + return ans; } } ``` @@ -106,20 +104,17 @@ class Solution { class Solution { public: double myPow(double x, int n) { - long long N = n; - return N >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); - } - - double qmi(double a, long long k) { - double res = 1; - while (k) { - if (k & 1) { - res *= a; + auto qpow = [](double a, long long n) { + double ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>= 1; - } - return res; + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long long) n); } }; ``` @@ -159,22 +154,20 @@ impl Solution { ```go func myPow(x float64, n int) float64 { - if n >= 0 { - return qmi(x, n) - } - return 1.0 / qmi(x, -n) -} - -func qmi(a float64, k int) float64 { - var res float64 = 1 - for k != 0 { - if k&1 == 1 { - res *= a + qpow := func(a float64, n int) float64 { + ans := 1.0 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans *= a + } + a *= a } - a *= a - k >>= 1 + return ans } - return res + if n >= 0 { + return qpow(x, n) + } + return 1 / qpow(x, -n) } ``` @@ -187,39 +180,35 @@ func qmi(a float64, k int) float64 { * @return {number} */ var myPow = function (x, n) { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -}; - -function qmi(a, k) { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; -} + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); +}; ``` ### **TypeScript** ```ts function myPow(x: number, n: number): number { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -} - -function qmi(a: number, k: number): number { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a: number, n: number): number => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); } ``` @@ -228,20 +217,18 @@ function qmi(a: number, k: number): number { ```cs public class Solution { public double MyPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); + return n >= 0 ? qpow(x, n) : 1.0 / qpow(x, -(long)n); } - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans *= a; } a *= a; - k >>= 1; } - return res; + return ans; } } ``` diff --git a/solution/0000-0099/0050.Pow(x, n)/README_EN.md b/solution/0000-0099/0050.Pow(x, n)/README_EN.md index 6f2a5d053b50d..b5532e39a7d23 100644 --- a/solution/0000-0099/0050.Pow(x, n)/README_EN.md +++ b/solution/0000-0099/0050.Pow(x, n)/README_EN.md @@ -49,16 +49,16 @@ ```python class Solution: def myPow(self, x: float, n: int) -> float: - def qmi(a, k): - res = 1 - while k: - if k & 1: - res *= a + def qpow(a: float, n: int) -> float: + ans = 1 + while n: + if n & 1: + ans *= a a *= a - k >>= 1 - return res + n >>= 1 + return ans - return qmi(x, n) if n >= 0 else 1 / qmi(x, -n) + return qpow(x, n) if n >= 0 else 1 / qpow(x, -n) ``` ### **Java** @@ -66,20 +66,18 @@ class Solution: ```java class Solution { public double myPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long) n); } - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a; } - a *= a; - k >>= 1; + a = a * a; } - return res; + return ans; } } ``` @@ -90,20 +88,17 @@ class Solution { class Solution { public: double myPow(double x, int n) { - long long N = n; - return N >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); - } - - double qmi(double a, long long k) { - double res = 1; - while (k) { - if (k & 1) { - res *= a; + auto qpow = [](double a, long long n) { + double ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>= 1; - } - return res; + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long long) n); } }; ``` @@ -143,22 +138,20 @@ impl Solution { ```go func myPow(x float64, n int) float64 { - if n >= 0 { - return qmi(x, n) - } - return 1.0 / qmi(x, -n) -} - -func qmi(a float64, k int) float64 { - var res float64 = 1 - for k != 0 { - if k&1 == 1 { - res *= a + qpow := func(a float64, n int) float64 { + ans := 1.0 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans *= a + } + a *= a } - a *= a - k >>= 1 + return ans } - return res + if n >= 0 { + return qpow(x, n) + } + return 1 / qpow(x, -n) } ``` @@ -171,39 +164,35 @@ func qmi(a float64, k int) float64 { * @return {number} */ var myPow = function (x, n) { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -}; - -function qmi(a, k) { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; -} + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); +}; ``` ### **TypeScript** ```ts function myPow(x: number, n: number): number { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -} - -function qmi(a: number, k: number): number { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a: number, n: number): number => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); } ``` @@ -212,20 +201,18 @@ function qmi(a: number, k: number): number { ```cs public class Solution { public double MyPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); + return n >= 0 ? qpow(x, n) : 1.0 / qpow(x, -(long)n); } - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans *= a; } a *= a; - k >>= 1; } - return res; + return ans; } } ``` diff --git a/solution/0000-0099/0050.Pow(x, n)/Solution.cpp b/solution/0000-0099/0050.Pow(x, n)/Solution.cpp index 6659ae4d24c2b..352fcf7bea155 100644 --- a/solution/0000-0099/0050.Pow(x, n)/Solution.cpp +++ b/solution/0000-0099/0050.Pow(x, n)/Solution.cpp @@ -1,19 +1,16 @@ -class Solution { -public: - double myPow(double x, int n) { - long long N = n; - return N >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); - } - - double qmi(double a, long long k) { - double res = 1; - while (k) { - if (k & 1) { - res *= a; - } - a *= a; - k >>= 1; - } - return res; - } +class Solution { +public: + double myPow(double x, int n) { + auto qpow = [](double a, long long n) { + double ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; + } + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long long) n); + } }; \ No newline at end of file diff --git a/solution/0000-0099/0050.Pow(x, n)/Solution.cs b/solution/0000-0099/0050.Pow(x, n)/Solution.cs index b733d5ffcfa68..93f0cd8681a88 100644 --- a/solution/0000-0099/0050.Pow(x, n)/Solution.cs +++ b/solution/0000-0099/0050.Pow(x, n)/Solution.cs @@ -1,18 +1,16 @@ -public class Solution { - public double MyPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); - } - - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; - } - a *= a; - k >>= 1; - } - return res; - } +public class Solution { + public double MyPow(double x, int n) { + return n >= 0 ? qpow(x, n) : 1.0 / qpow(x, -(long)n); + } + + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans *= a; + } + a *= a; + } + return ans; + } } \ No newline at end of file diff --git a/solution/0000-0099/0050.Pow(x, n)/Solution.go b/solution/0000-0099/0050.Pow(x, n)/Solution.go index 714071b90fae5..1f714843d7f49 100644 --- a/solution/0000-0099/0050.Pow(x, n)/Solution.go +++ b/solution/0000-0099/0050.Pow(x, n)/Solution.go @@ -1,18 +1,16 @@ func myPow(x float64, n int) float64 { - if n >= 0 { - return qmi(x, n) - } - return 1.0 / qmi(x, -n) -} - -func qmi(a float64, k int) float64 { - var res float64 = 1 - for k != 0 { - if k&1 == 1 { - res *= a + qpow := func(a float64, n int) float64 { + ans := 1.0 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans *= a + } + a *= a } - a *= a - k >>= 1 + return ans + } + if n >= 0 { + return qpow(x, n) } - return res + return 1 / qpow(x, -n) } \ No newline at end of file diff --git a/solution/0000-0099/0050.Pow(x, n)/Solution.java b/solution/0000-0099/0050.Pow(x, n)/Solution.java index 1e399983dcf9a..efa1dc56dd04d 100644 --- a/solution/0000-0099/0050.Pow(x, n)/Solution.java +++ b/solution/0000-0099/0050.Pow(x, n)/Solution.java @@ -1,18 +1,16 @@ -class Solution { - public double myPow(double x, int n) { - long N = n; - return n >= 0 ? qmi(x, N) : 1.0 / qmi(x, -N); - } - - private double qmi(double a, long k) { - double res = 1; - while (k != 0) { - if ((k & 1) != 0) { - res *= a; - } - a *= a; - k >>= 1; - } - return res; - } +class Solution { + public double myPow(double x, int n) { + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -(long) n); + } + + private double qpow(double a, long n) { + double ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a; + } + a = a * a; + } + return ans; + } } \ No newline at end of file diff --git a/solution/0000-0099/0050.Pow(x, n)/Solution.js b/solution/0000-0099/0050.Pow(x, n)/Solution.js index 752ec5e7649bf..cd6d1323b2b6b 100644 --- a/solution/0000-0099/0050.Pow(x, n)/Solution.js +++ b/solution/0000-0099/0050.Pow(x, n)/Solution.js @@ -4,17 +4,15 @@ * @return {number} */ var myPow = function (x, n) { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -}; - -function qmi(a, k) { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; -} + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); +}; diff --git a/solution/0000-0099/0050.Pow(x, n)/Solution.py b/solution/0000-0099/0050.Pow(x, n)/Solution.py index 2e216312d422c..94981abc703d4 100644 --- a/solution/0000-0099/0050.Pow(x, n)/Solution.py +++ b/solution/0000-0099/0050.Pow(x, n)/Solution.py @@ -1,12 +1,12 @@ -class Solution: - def myPow(self, x: float, n: int) -> float: - def qmi(a, k): - res = 1 - while k: - if k & 1: - res *= a - a *= a - k >>= 1 - return res - - return qmi(x, n) if n >= 0 else 1 / qmi(x, -n) +class Solution: + def myPow(self, x: float, n: int) -> float: + def qpow(a: float, n: int) -> float: + ans = 1 + while n: + if n & 1: + ans *= a + a *= a + n >>= 1 + return ans + + return qpow(x, n) if n >= 0 else 1 / qpow(x, -n) diff --git a/solution/0000-0099/0050.Pow(x, n)/Solution.ts b/solution/0000-0099/0050.Pow(x, n)/Solution.ts index 9afc6c919d6f8..96fc09a5ff70c 100644 --- a/solution/0000-0099/0050.Pow(x, n)/Solution.ts +++ b/solution/0000-0099/0050.Pow(x, n)/Solution.ts @@ -1,15 +1,13 @@ function myPow(x: number, n: number): number { - return n >= 0 ? qmi(x, n) : 1 / qmi(x, -n); -} - -function qmi(a: number, k: number): number { - let res = 1; - while (k) { - if (k & 1) { - res *= a; + const qpow = (a: number, n: number): number => { + let ans = 1; + for (; n; n >>>= 1) { + if (n & 1) { + ans *= a; + } + a *= a; } - a *= a; - k >>>= 1; - } - return res; + return ans; + }; + return n >= 0 ? qpow(x, n) : 1 / qpow(x, -n); } diff --git a/solution/1800-1899/1808.Maximize Number of Nice Divisors/README.md b/solution/1800-1899/1808.Maximize Number of Nice Divisors/README.md index 982c7cc428aff..45c7e0f4ca0ba 100644 --- a/solution/1800-1899/1808.Maximize Number of Nice Divisors/README.md +++ b/solution/1800-1899/1808.Maximize Number of Nice Divisors/README.md @@ -90,30 +90,30 @@ class Solution: ```java class Solution { + private final int mod = (int) 1e9 + 7; + public int maxNiceDivisors(int primeFactors) { if (primeFactors < 4) { return primeFactors; } - final int mod = (int) 1e9 + 7; if (primeFactors % 3 == 0) { - return (int) qmi(3, primeFactors / 3, mod); + return qpow(3, primeFactors / 3); } if (primeFactors % 3 == 1) { - return (int) (4 * qmi(3, primeFactors / 3 - 1, mod) % mod); + return (int) (4L * qpow(3, primeFactors / 3 - 1) % mod); } - return (int) (2 * qmi(3, primeFactors / 3, mod) % mod); + return 2 * qpow(3, primeFactors / 3) % mod; } - private long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + private int qpow(long a, long n) { + long ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a % mod; } - k >>= 1; - a = a * a % p; + a = a * a % mod; } - return res; + return (int) ans; } } ``` @@ -128,25 +128,23 @@ public: return primeFactors; } const int mod = 1e9 + 7; + auto qpow = [&](long long a, long long n) { + long long ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return (int) ans; + }; if (primeFactors % 3 == 0) { - return qmi(3, primeFactors / 3, mod); + return qpow(3, primeFactors / 3); } if (primeFactors % 3 == 1) { - return 4 * qmi(3, primeFactors / 3 - 1, mod) % mod; - } - return 2 * qmi(3, primeFactors / 3, mod) % mod; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; - } - k >>= 1; - a = a * a % p; + return qpow(3, primeFactors / 3 - 1) * 4L % mod; } - return res; + return qpow(3, primeFactors / 3) * 2 % mod; } }; ``` @@ -158,27 +156,58 @@ func maxNiceDivisors(primeFactors int) int { if primeFactors < 4 { return primeFactors } - const mod int = 1e9 + 7 + const mod = 1e9 + 7 + qpow := func(a, n int) int { + ans := 1 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans = ans * a % mod + } + a = a * a % mod + } + return ans + } if primeFactors%3 == 0 { - return qmi(3, primeFactors/3, mod) + return qpow(3, primeFactors/3) } if primeFactors%3 == 1 { - return 4 * qmi(3, primeFactors/3-1, mod) % mod + return qpow(3, primeFactors/3-1) * 4 % mod } - return 2 * qmi(3, primeFactors/3, mod) % mod + return qpow(3, primeFactors/3) * 2 % mod } +``` -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p - } - k >>= 1 - a = a * a % p - } - return res -} +### **JavaScript** + +```js +/** + * @param {number} primeFactors + * @return {number} + */ +var maxNiceDivisors = function (primeFactors) { + if (primeFactors < 4) { + return primeFactors; + } + const mod = 1e9 + 7; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = Number((BigInt(ans) * BigInt(a)) % BigInt(mod)); + } + a = Number((BigInt(a) * BigInt(a)) % BigInt(mod)); + } + return ans; + }; + const k = Math.floor(primeFactors / 3); + if (primeFactors % 3 === 0) { + return qpow(3, k); + } + if (primeFactors % 3 === 1) { + return (4 * qpow(3, k - 1)) % mod; + } + return (2 * qpow(3, k)) % mod; +}; ``` ### **...** diff --git a/solution/1800-1899/1808.Maximize Number of Nice Divisors/README_EN.md b/solution/1800-1899/1808.Maximize Number of Nice Divisors/README_EN.md index c510608de6612..7ac14cc8046a9 100644 --- a/solution/1800-1899/1808.Maximize Number of Nice Divisors/README_EN.md +++ b/solution/1800-1899/1808.Maximize Number of Nice Divisors/README_EN.md @@ -63,30 +63,30 @@ class Solution: ```java class Solution { + private final int mod = (int) 1e9 + 7; + public int maxNiceDivisors(int primeFactors) { if (primeFactors < 4) { return primeFactors; } - final int mod = (int) 1e9 + 7; if (primeFactors % 3 == 0) { - return (int) qmi(3, primeFactors / 3, mod); + return qpow(3, primeFactors / 3); } if (primeFactors % 3 == 1) { - return (int) (4 * qmi(3, primeFactors / 3 - 1, mod) % mod); + return (int) (4L * qpow(3, primeFactors / 3 - 1) % mod); } - return (int) (2 * qmi(3, primeFactors / 3, mod) % mod); + return 2 * qpow(3, primeFactors / 3) % mod; } - private long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + private int qpow(long a, long n) { + long ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a % mod; } - k >>= 1; - a = a * a % p; + a = a * a % mod; } - return res; + return (int) ans; } } ``` @@ -101,25 +101,23 @@ public: return primeFactors; } const int mod = 1e9 + 7; + auto qpow = [&](long long a, long long n) { + long long ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return (int) ans; + }; if (primeFactors % 3 == 0) { - return qmi(3, primeFactors / 3, mod); + return qpow(3, primeFactors / 3); } if (primeFactors % 3 == 1) { - return 4 * qmi(3, primeFactors / 3 - 1, mod) % mod; - } - return 2 * qmi(3, primeFactors / 3, mod) % mod; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; - } - k >>= 1; - a = a * a % p; + return qpow(3, primeFactors / 3 - 1) * 4L % mod; } - return res; + return qpow(3, primeFactors / 3) * 2 % mod; } }; ``` @@ -131,27 +129,58 @@ func maxNiceDivisors(primeFactors int) int { if primeFactors < 4 { return primeFactors } - const mod int = 1e9 + 7 + const mod = 1e9 + 7 + qpow := func(a, n int) int { + ans := 1 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans = ans * a % mod + } + a = a * a % mod + } + return ans + } if primeFactors%3 == 0 { - return qmi(3, primeFactors/3, mod) + return qpow(3, primeFactors/3) } if primeFactors%3 == 1 { - return 4 * qmi(3, primeFactors/3-1, mod) % mod + return qpow(3, primeFactors/3-1) * 4 % mod } - return 2 * qmi(3, primeFactors/3, mod) % mod + return qpow(3, primeFactors/3) * 2 % mod } +``` -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p - } - k >>= 1 - a = a * a % p - } - return res -} +### **JavaScript** + +```js +/** + * @param {number} primeFactors + * @return {number} + */ +var maxNiceDivisors = function (primeFactors) { + if (primeFactors < 4) { + return primeFactors; + } + const mod = 1e9 + 7; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = Number((BigInt(ans) * BigInt(a)) % BigInt(mod)); + } + a = Number((BigInt(a) * BigInt(a)) % BigInt(mod)); + } + return ans; + }; + const k = Math.floor(primeFactors / 3); + if (primeFactors % 3 === 0) { + return qpow(3, k); + } + if (primeFactors % 3 === 1) { + return (4 * qpow(3, k - 1)) % mod; + } + return (2 * qpow(3, k)) % mod; +}; ``` ### **...** diff --git a/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.cpp b/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.cpp index 8c0d670a92bf2..4bb603ceb2174 100644 --- a/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.cpp +++ b/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.cpp @@ -1,28 +1,26 @@ -class Solution { -public: - int maxNiceDivisors(int primeFactors) { - if (primeFactors < 4) { - return primeFactors; - } - const int mod = 1e9 + 7; - if (primeFactors % 3 == 0) { - return qmi(3, primeFactors / 3, mod); - } - if (primeFactors % 3 == 1) { - return 4 * qmi(3, primeFactors / 3 - 1, mod) % mod; - } - return 2 * qmi(3, primeFactors / 3, mod) % mod; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; - } - k >>= 1; - a = a * a % p; - } - return res; - } +class Solution { +public: + int maxNiceDivisors(int primeFactors) { + if (primeFactors < 4) { + return primeFactors; + } + const int mod = 1e9 + 7; + auto qpow = [&](long long a, long long n) { + long long ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return (int) ans; + }; + if (primeFactors % 3 == 0) { + return qpow(3, primeFactors / 3); + } + if (primeFactors % 3 == 1) { + return qpow(3, primeFactors / 3 - 1) * 4L % mod; + } + return qpow(3, primeFactors / 3) * 2 % mod; + } }; \ No newline at end of file diff --git a/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.go b/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.go index 57a805dc96354..c75144e39991a 100644 --- a/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.go +++ b/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.go @@ -2,24 +2,22 @@ func maxNiceDivisors(primeFactors int) int { if primeFactors < 4 { return primeFactors } - const mod int = 1e9 + 7 + const mod = 1e9 + 7 + qpow := func(a, n int) int { + ans := 1 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans = ans * a % mod + } + a = a * a % mod + } + return ans + } if primeFactors%3 == 0 { - return qmi(3, primeFactors/3, mod) + return qpow(3, primeFactors/3) } if primeFactors%3 == 1 { - return 4 * qmi(3, primeFactors/3-1, mod) % mod - } - return 2 * qmi(3, primeFactors/3, mod) % mod -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p - } - k >>= 1 - a = a * a % p + return qpow(3, primeFactors/3-1) * 4 % mod } - return res + return qpow(3, primeFactors/3) * 2 % mod } \ No newline at end of file diff --git a/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.java b/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.java index a1f21ab8834bd..49c391e8477a4 100644 --- a/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.java +++ b/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.java @@ -1,27 +1,27 @@ -class Solution { - public int maxNiceDivisors(int primeFactors) { - if (primeFactors < 4) { - return primeFactors; - } - final int mod = (int) 1e9 + 7; - if (primeFactors % 3 == 0) { - return (int) qmi(3, primeFactors / 3, mod); - } - if (primeFactors % 3 == 1) { - return (int) (4 * qmi(3, primeFactors / 3 - 1, mod) % mod); - } - return (int) (2 * qmi(3, primeFactors / 3, mod) % mod); - } - - private long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; - } - k >>= 1; - a = a * a % p; - } - return res; - } +class Solution { + private final int mod = (int) 1e9 + 7; + + public int maxNiceDivisors(int primeFactors) { + if (primeFactors < 4) { + return primeFactors; + } + if (primeFactors % 3 == 0) { + return qpow(3, primeFactors / 3); + } + if (primeFactors % 3 == 1) { + return (int) (4L * qpow(3, primeFactors / 3 - 1) % mod); + } + return 2 * qpow(3, primeFactors / 3) % mod; + } + + private int qpow(long a, long n) { + long ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return (int) ans; + } } \ No newline at end of file diff --git a/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.js b/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.js new file mode 100644 index 0000000000000..8fe82878c556a --- /dev/null +++ b/solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.js @@ -0,0 +1,28 @@ +/** + * @param {number} primeFactors + * @return {number} + */ +var maxNiceDivisors = function (primeFactors) { + if (primeFactors < 4) { + return primeFactors; + } + const mod = 1e9 + 7; + const qpow = (a, n) => { + let ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = Number((BigInt(ans) * BigInt(a)) % BigInt(mod)); + } + a = Number((BigInt(a) * BigInt(a)) % BigInt(mod)); + } + return ans; + }; + const k = Math.floor(primeFactors / 3); + if (primeFactors % 3 === 0) { + return qpow(3, k); + } + if (primeFactors % 3 === 1) { + return (4 * qpow(3, k - 1)) % mod; + } + return (2 * qpow(3, k)) % mod; +}; diff --git a/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README.md b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README.md index 1f2a54503d0f1..d66ff947fdd5c 100644 --- a/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README.md +++ b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README.md @@ -97,20 +97,19 @@ class Solution { public int minNonZeroProduct(int p) { final int mod = (int) 1e9 + 7; long a = ((1L << p) - 1) % mod; - long b = qmi(((1L << p) - 2) % mod, (1L << (p - 1)) - 1, mod); + long b = qpow(((1L << p) - 2) % mod, (1L << (p - 1)) - 1, mod); return (int) (a * b % mod); } - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + private long qpow(long a, long n, int mod) { + long ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a % mod; } - k >>= 1; - a = a * a % p; + a = a * a % mod; } - return res; + return ans; } } ``` @@ -121,22 +120,21 @@ class Solution { class Solution { public: int minNonZeroProduct(int p) { + using ll = long long; const int mod = 1e9 + 7; - long long a = ((1LL << p) - 1) % mod; - long long b = qmi(((1LL << p) - 2) % mod, (1L << (p - 1)) - 1, mod); - return a * b % mod; - } - - long long qmi(long long a, long long k, int p) { - long long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + auto qpow = [](ll a, ll n) { + ll ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; } - k >>= 1; - a = a * a % p; - } - return res; + return ans; + }; + ll a = ((1LL << p) - 1) % mod; + ll b = qpow(((1LL << p) - 2) % mod, (1L << (p - 1)) - 1); + return a * b % mod; } }; ``` @@ -146,21 +144,41 @@ public: ```go func minNonZeroProduct(p int) int { const mod int = 1e9 + 7 + qpow := func(a, n int) int { + ans := 1 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans = ans * a % mod + } + a = a * a % mod + } + return ans + } a := ((1 << p) - 1) % mod - b := qmi(((1<
>= 1 - a = a * a % p - } - return res +### **TypeScript** + +```ts +function minNonZeroProduct(p: number): number { + const mod = BigInt(1e9 + 7); + + const qpow = (a: bigint, n: bigint): bigint => { + let ans = BigInt(1); + for (; n; n >>= BigInt(1)) { + if (n & BigInt(1)) { + ans = (ans * a) % mod; + } + a = (a * a) % mod; + } + return ans; + }; + const a = (2n ** BigInt(p) - 1n) % mod; + const b = qpow((2n ** BigInt(p) - 2n) % mod, 2n ** (BigInt(p) - 1n) - 1n); + return Number((a * b) % mod); } ``` diff --git a/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README_EN.md b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README_EN.md index bedea8cfad6d6..769a4190727ad 100644 --- a/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README_EN.md +++ b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/README_EN.md @@ -77,20 +77,19 @@ class Solution { public int minNonZeroProduct(int p) { final int mod = (int) 1e9 + 7; long a = ((1L << p) - 1) % mod; - long b = qmi(((1L << p) - 2) % mod, (1L << (p - 1)) - 1, mod); + long b = qpow(((1L << p) - 2) % mod, (1L << (p - 1)) - 1, mod); return (int) (a * b % mod); } - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + private long qpow(long a, long n, int mod) { + long ans = 1; + for (; n > 0; n >>= 1) { + if ((n & 1) == 1) { + ans = ans * a % mod; } - k >>= 1; - a = a * a % p; + a = a * a % mod; } - return res; + return ans; } } ``` @@ -101,22 +100,21 @@ class Solution { class Solution { public: int minNonZeroProduct(int p) { + using ll = long long; const int mod = 1e9 + 7; - long long a = ((1LL << p) - 1) % mod; - long long b = qmi(((1LL << p) - 2) % mod, (1L << (p - 1)) - 1, mod); - return a * b % mod; - } - - long long qmi(long long a, long long k, int p) { - long long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + auto qpow = [](ll a, ll n) { + ll ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; } - k >>= 1; - a = a * a % p; - } - return res; + return ans; + }; + ll a = ((1LL << p) - 1) % mod; + ll b = qpow(((1LL << p) - 2) % mod, (1L << (p - 1)) - 1); + return a * b % mod; } }; ``` @@ -126,21 +124,41 @@ public: ```go func minNonZeroProduct(p int) int { const mod int = 1e9 + 7 + qpow := func(a, n int) int { + ans := 1 + for ; n > 0; n >>= 1 { + if n&1 == 1 { + ans = ans * a % mod + } + a = a * a % mod + } + return ans + } a := ((1 << p) - 1) % mod - b := qmi(((1<
>= 1 - a = a * a % p - } - return res +### **TypeScript** + +```ts +function minNonZeroProduct(p: number): number { + const mod = BigInt(1e9 + 7); + + const qpow = (a: bigint, n: bigint): bigint => { + let ans = BigInt(1); + for (; n; n >>= BigInt(1)) { + if (n & BigInt(1)) { + ans = (ans * a) % mod; + } + a = (a * a) % mod; + } + return ans; + }; + const a = (2n ** BigInt(p) - 1n) % mod; + const b = qpow((2n ** BigInt(p) - 2n) % mod, 2n ** (BigInt(p) - 1n) - 1n); + return Number((a * b) % mod); } ``` diff --git a/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.cpp b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.cpp index 568ecc0364519..f2d3a7573f2c3 100644 --- a/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.cpp +++ b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.cpp @@ -1,21 +1,20 @@ class Solution { public: int minNonZeroProduct(int p) { + using ll = long long; const int mod = 1e9 + 7; - long long a = ((1LL << p) - 1) % mod; - long long b = qmi(((1LL << p) - 2) % mod, (1L << (p - 1)) - 1, mod); - return a * b % mod; - } - - long long qmi(long long a, long long k, int p) { - long long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + auto qpow = [](ll a, ll n) { + ll ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; } - k >>= 1; - a = a * a % p; - } - return res; + return ans; + }; + ll a = ((1LL << p) - 1) % mod; + ll b = qpow(((1LL << p) - 2) % mod, (1L << (p - 1)) - 1); + return a * b % mod; } }; \ No newline at end of file diff --git a/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.go b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.go index c3c8bcf12b774..c2c453b76c2b3 100644 --- a/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.go +++ b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.go @@ -1,18 +1,16 @@ func minNonZeroProduct(p int) int { const mod int = 1e9 + 7 - a := ((1 << p) - 1) % mod - b := qmi(((1<
0; n >>= 1 { + if n&1 == 1 { + ans = ans * a % mod + } + a = a * a % mod } - k >>= 1 - a = a * a % p + return ans } - return res + a := ((1 << p) - 1) % mod + b := qpow(((1<
0; n >>= 1) {
+ if ((n & 1) == 1) {
+ ans = ans * a % mod;
}
- k >>= 1;
- a = a * a % p;
+ a = a * a % mod;
}
- return res;
+ return ans;
}
}
\ No newline at end of file
diff --git a/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.ts b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.ts
new file mode 100644
index 0000000000000..abb504bb0ff60
--- /dev/null
+++ b/solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.ts
@@ -0,0 +1,17 @@
+function minNonZeroProduct(p: number): number {
+ const mod = BigInt(1e9 + 7);
+
+ const qpow = (a: bigint, n: bigint): bigint => {
+ let ans = BigInt(1);
+ for (; n; n >>= BigInt(1)) {
+ if (n & BigInt(1)) {
+ ans = (ans * a) % mod;
+ }
+ a = (a * a) % mod;
+ }
+ return ans;
+ };
+ const a = (2n ** BigInt(p) - 1n) % mod;
+ const b = qpow((2n ** BigInt(p) - 2n) % mod, 2n ** (BigInt(p) - 1n) - 1n);
+ return Number((a * b) % mod);
+}
diff --git a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/README.md b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/README.md
index 76654725ff765..28813cfff2929 100644
--- a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/README.md
+++ b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/README.md
@@ -87,15 +87,16 @@ class Solution:
```java
class Solution {
+ private final int mod = (int) 1e9 + 7;
+
public int maxFrequencyScore(int[] nums, int k) {
- final int mod = (int) 1e9 + 7;
Map