From b80b74feaa4f73934be41bba7909437e7deb780e Mon Sep 17 00:00:00 2001 From: yanglbme Date: Thu, 14 Sep 2023 16:59:34 +0800 Subject: [PATCH] feat: add solutions to lc/lcof problems --- .../README.md" | 142 +++++++------- .../Solution.cpp" | 52 +++--- .../Solution.go" | 28 ++- .../Solution.java" | 52 +++--- .../Solution.js" | 32 ++-- .../README.md" | 176 ++++++++++-------- .../Solution.cpp" | 33 ++-- .../Solution.cs" | 16 +- .../Solution.go" | 26 ++- .../Solution.java" | 32 ++-- .../Solution.js" | 24 ++- .../Solution.py" | 24 +-- .../Solution.rs" | 26 +++ .../Solution.ts" | 22 +-- solution/0000-0099/0050.Pow(x, n)/README.md | 145 +++++++-------- .../0000-0099/0050.Pow(x, n)/README_EN.md | 145 +++++++-------- .../0000-0099/0050.Pow(x, n)/Solution.cpp | 33 ++-- solution/0000-0099/0050.Pow(x, n)/Solution.cs | 32 ++-- solution/0000-0099/0050.Pow(x, n)/Solution.go | 26 ++- .../0000-0099/0050.Pow(x, n)/Solution.java | 32 ++-- solution/0000-0099/0050.Pow(x, n)/Solution.js | 24 ++- solution/0000-0099/0050.Pow(x, n)/Solution.py | 24 +-- solution/0000-0099/0050.Pow(x, n)/Solution.ts | 22 +-- .../README.md | 113 ++++++----- .../README_EN.md | 113 ++++++----- .../Solution.cpp | 52 +++--- .../Solution.go | 30 ++- .../Solution.java | 52 +++--- .../Solution.js | 28 +++ .../README.md | 86 +++++---- .../README_EN.md | 86 +++++---- .../Solution.cpp | 27 ++- .../Solution.go | 24 ++- .../Solution.java | 17 +- .../Solution.ts | 17 ++ .../README.md | 89 +++++---- .../README_EN.md | 89 +++++---- .../Solution.cpp | 75 ++++---- .../Solution.go | 28 ++- .../Solution.java | 92 ++++----- .../README.md | 84 ++++----- .../README_EN.md | 84 ++++----- .../Solution.cpp | 35 ++-- .../Solution.go | 20 +- .../Solution.java | 33 ++-- .../Solution.ts | 24 ++- .../README.md | 60 +++--- .../README_EN.md | 60 +++--- .../Solution.cpp | 45 +++-- .../Solution.go | 20 +- .../Solution.java | 47 +++-- .../README.md | 92 +++++---- .../README_EN.md | 92 +++++---- .../Solution.cpp | 26 ++- .../Solution.go | 26 ++- .../Solution.java | 19 +- .../Solution.ts | 19 +- .../README.md | 98 +++++----- .../README_EN.md | 98 +++++----- .../Solution.cpp | 24 ++- .../Solution.go | 22 +-- .../Solution.java | 20 +- .../Solution.ts | 32 ++-- 63 files changed, 1659 insertions(+), 1607 deletions(-) create mode 100644 "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" create mode 100644 solution/1800-1899/1808.Maximize Number of Nice Divisors/Solution.js create mode 100644 solution/1900-1999/1969.Minimum Non-Zero Product of the Array Elements/Solution.ts 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 cnt = new HashMap<>(); for (int i = 0; i < k; ++i) { - cnt.put(nums[i], cnt.getOrDefault(nums[i], 0) + 1); + cnt.merge(nums[i], 1, Integer::sum); } long cur = 0; for (var e : cnt.entrySet()) { - cur = (cur + qmi(e.getKey(), e.getValue(), mod)) % mod; + cur = (cur + qpow(e.getKey(), e.getValue())) % mod; } long ans = cur; for (int i = k; i < nums.length; ++i) { @@ -103,12 +104,12 @@ class Solution { int b = nums[i]; if (a != b) { if (cnt.getOrDefault(b, 0) > 0) { - cur += (b - 1) * qmi(b, cnt.get(b), mod) % mod; + cur += (b - 1) * qpow(b, cnt.get(b)) % mod; } else { cur += b; } if (cnt.getOrDefault(a, 0) > 1) { - cur -= (a - 1) * qmi(a, cnt.get(a) - 1, mod) % mod; + cur -= (a - 1) * qpow(a, cnt.get(a) - 1) % mod; } else { cur -= a; } @@ -121,16 +122,15 @@ class Solution { return (int) ans; } - 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) { + 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; } } ``` @@ -141,21 +141,32 @@ class Solution { class Solution { public: int maxFrequencyScore(vector& nums, int k) { + using ll = long long; + const int mod = 1e9 + 7; + auto qpow = [&](ll a, ll n) { + ll ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return ans; + }; unordered_map cnt; for (int i = 0; i < k; ++i) { cnt[nums[i]]++; } - long cur = 0; - const int mod = 1e9 + 7; + ll cur = 0; for (auto& [k, v] : cnt) { - cur = (cur + qmi(k, v, mod)) % mod; + cur = (cur + qpow(k, v)) % mod; } - long ans = cur; + ll ans = cur; for (int i = k; i < nums.size(); ++i) { int a = nums[i - k], b = nums[i]; if (a != b) { - cur += cnt[b] ? (b - 1) * qmi(b, cnt[b], mod) % mod : b; - cur -= cnt[a] > 1 ? (a - 1) * qmi(a, cnt[a] - 1, mod) % mod : a; + cur += cnt[b] ? (b - 1) * qpow(b, cnt[b]) % mod : b; + cur -= cnt[a] > 1 ? (a - 1) * qpow(a, cnt[a] - 1) % mod : a; cur = (cur + mod) % mod; ans = max(ans, cur); cnt[b]++; @@ -164,18 +175,6 @@ public: } return ans; } - - 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; - } }; ``` @@ -189,20 +188,30 @@ func maxFrequencyScore(nums []int, k int) int { } cur := 0 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 + } for k, v := range cnt { - cur = (cur + qmi(k, v, mod)) % mod + cur = (cur + qpow(k, v)) % mod } ans := cur for i := k; i < len(nums); i++ { a, b := nums[i-k], nums[i] if a != b { if cnt[b] > 0 { - cur += (b - 1) * qmi(b, cnt[b], mod) % mod + cur += (b - 1) * qpow(b, cnt[b]) % mod } else { cur += b } if cnt[a] > 1 { - cur -= (a - 1) * qmi(a, cnt[a]-1, mod) % mod + cur -= (a - 1) * qpow(a, cnt[a]-1) % mod } else { cur -= a } @@ -221,18 +230,6 @@ func max(a, b int) int { } return b } - -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 -} ``` ### **...** diff --git a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/README_EN.md b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/README_EN.md index 2984f6b8db15f..bb827518af2cd 100644 --- a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/README_EN.md +++ b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/README_EN.md @@ -71,15 +71,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 cnt = new HashMap<>(); for (int i = 0; i < k; ++i) { - cnt.put(nums[i], cnt.getOrDefault(nums[i], 0) + 1); + cnt.merge(nums[i], 1, Integer::sum); } long cur = 0; for (var e : cnt.entrySet()) { - cur = (cur + qmi(e.getKey(), e.getValue(), mod)) % mod; + cur = (cur + qpow(e.getKey(), e.getValue())) % mod; } long ans = cur; for (int i = k; i < nums.length; ++i) { @@ -87,12 +88,12 @@ class Solution { int b = nums[i]; if (a != b) { if (cnt.getOrDefault(b, 0) > 0) { - cur += (b - 1) * qmi(b, cnt.get(b), mod) % mod; + cur += (b - 1) * qpow(b, cnt.get(b)) % mod; } else { cur += b; } if (cnt.getOrDefault(a, 0) > 1) { - cur -= (a - 1) * qmi(a, cnt.get(a) - 1, mod) % mod; + cur -= (a - 1) * qpow(a, cnt.get(a) - 1) % mod; } else { cur -= a; } @@ -105,16 +106,15 @@ class Solution { return (int) ans; } - 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) { + 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; } } ``` @@ -125,21 +125,32 @@ class Solution { class Solution { public: int maxFrequencyScore(vector& nums, int k) { + using ll = long long; + const int mod = 1e9 + 7; + auto qpow = [&](ll a, ll n) { + ll ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return ans; + }; unordered_map cnt; for (int i = 0; i < k; ++i) { cnt[nums[i]]++; } - long cur = 0; - const int mod = 1e9 + 7; + ll cur = 0; for (auto& [k, v] : cnt) { - cur = (cur + qmi(k, v, mod)) % mod; + cur = (cur + qpow(k, v)) % mod; } - long ans = cur; + ll ans = cur; for (int i = k; i < nums.size(); ++i) { int a = nums[i - k], b = nums[i]; if (a != b) { - cur += cnt[b] ? (b - 1) * qmi(b, cnt[b], mod) % mod : b; - cur -= cnt[a] > 1 ? (a - 1) * qmi(a, cnt[a] - 1, mod) % mod : a; + cur += cnt[b] ? (b - 1) * qpow(b, cnt[b]) % mod : b; + cur -= cnt[a] > 1 ? (a - 1) * qpow(a, cnt[a] - 1) % mod : a; cur = (cur + mod) % mod; ans = max(ans, cur); cnt[b]++; @@ -148,18 +159,6 @@ public: } return ans; } - - 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; - } }; ``` @@ -173,20 +172,30 @@ func maxFrequencyScore(nums []int, k int) int { } cur := 0 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 + } for k, v := range cnt { - cur = (cur + qmi(k, v, mod)) % mod + cur = (cur + qpow(k, v)) % mod } ans := cur for i := k; i < len(nums); i++ { a, b := nums[i-k], nums[i] if a != b { if cnt[b] > 0 { - cur += (b - 1) * qmi(b, cnt[b], mod) % mod + cur += (b - 1) * qpow(b, cnt[b]) % mod } else { cur += b } if cnt[a] > 1 { - cur -= (a - 1) * qmi(a, cnt[a]-1, mod) % mod + cur -= (a - 1) * qpow(a, cnt[a]-1) % mod } else { cur -= a } @@ -205,18 +214,6 @@ func max(a, b int) int { } return b } - -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 -} ``` ### **...** diff --git a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.cpp b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.cpp index 27d7ed1155435..bb758608a78bb 100644 --- a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.cpp +++ b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.cpp @@ -1,39 +1,38 @@ -class Solution { -public: - int maxFrequencyScore(vector& nums, int k) { - unordered_map cnt; - for (int i = 0; i < k; ++i) { - cnt[nums[i]]++; - } - long cur = 0; - const int mod = 1e9 + 7; - for (auto& [k, v] : cnt) { - cur = (cur + qmi(k, v, mod)) % mod; - } - long ans = cur; - for (int i = k; i < nums.size(); ++i) { - int a = nums[i - k], b = nums[i]; - if (a != b) { - cur += cnt[b] ? (b - 1) * qmi(b, cnt[b], mod) % mod : b; - cur -= cnt[a] > 1 ? (a - 1) * qmi(a, cnt[a] - 1, mod) % mod : a; - cur = (cur + mod) % mod; - ans = max(ans, cur); - cnt[b]++; - cnt[a]--; - } - } - return ans; - } - - 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 maxFrequencyScore(vector& nums, int k) { + using ll = long long; + const int mod = 1e9 + 7; + auto qpow = [&](ll a, ll n) { + ll ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return ans; + }; + unordered_map cnt; + for (int i = 0; i < k; ++i) { + cnt[nums[i]]++; + } + ll cur = 0; + for (auto& [k, v] : cnt) { + cur = (cur + qpow(k, v)) % mod; + } + ll ans = cur; + for (int i = k; i < nums.size(); ++i) { + int a = nums[i - k], b = nums[i]; + if (a != b) { + cur += cnt[b] ? (b - 1) * qpow(b, cnt[b]) % mod : b; + cur -= cnt[a] > 1 ? (a - 1) * qpow(a, cnt[a] - 1) % mod : a; + cur = (cur + mod) % mod; + ans = max(ans, cur); + cnt[b]++; + cnt[a]--; + } + } + return ans; + } }; \ No newline at end of file diff --git a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.go b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.go index 77723d5702040..fa9ce8f1b7b60 100644 --- a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.go +++ b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.go @@ -5,20 +5,30 @@ func maxFrequencyScore(nums []int, k int) int { } cur := 0 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 + } for k, v := range cnt { - cur = (cur + qmi(k, v, mod)) % mod + cur = (cur + qpow(k, v)) % mod } ans := cur for i := k; i < len(nums); i++ { a, b := nums[i-k], nums[i] if a != b { if cnt[b] > 0 { - cur += (b - 1) * qmi(b, cnt[b], mod) % mod + cur += (b - 1) * qpow(b, cnt[b]) % mod } else { cur += b } if cnt[a] > 1 { - cur -= (a - 1) * qmi(a, cnt[a]-1, mod) % mod + cur -= (a - 1) * qpow(a, cnt[a]-1) % mod } else { cur -= a } @@ -36,16 +46,4 @@ func max(a, b int) int { return a } return b -} - -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 } \ No newline at end of file diff --git a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.java b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.java index d9e0eae6e258d..43c71f2e86343 100644 --- a/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.java +++ b/solution/2500-2599/2524.Maximum Frequency Score of a Subarray/Solution.java @@ -1,47 +1,47 @@ -class Solution { - public int maxFrequencyScore(int[] nums, int k) { - final int mod = (int) 1e9 + 7; - Map cnt = new HashMap<>(); - for (int i = 0; i < k; ++i) { - cnt.put(nums[i], cnt.getOrDefault(nums[i], 0) + 1); - } - long cur = 0; - for (var e : cnt.entrySet()) { - cur = (cur + qmi(e.getKey(), e.getValue(), mod)) % mod; - } - long ans = cur; - for (int i = k; i < nums.length; ++i) { - int a = nums[i - k]; - int b = nums[i]; - if (a != b) { - if (cnt.getOrDefault(b, 0) > 0) { - cur += (b - 1) * qmi(b, cnt.get(b), mod) % mod; - } else { - cur += b; - } - if (cnt.getOrDefault(a, 0) > 1) { - cur -= (a - 1) * qmi(a, cnt.get(a) - 1, mod) % mod; - } else { - cur -= a; - } - cur = (cur + mod) % mod; - cnt.put(b, cnt.getOrDefault(b, 0) + 1); - cnt.put(a, cnt.getOrDefault(a, 0) - 1); - ans = Math.max(ans, cur); - } - } - return (int) ans; - } - - 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 maxFrequencyScore(int[] nums, int k) { + Map cnt = new HashMap<>(); + for (int i = 0; i < k; ++i) { + cnt.merge(nums[i], 1, Integer::sum); + } + long cur = 0; + for (var e : cnt.entrySet()) { + cur = (cur + qpow(e.getKey(), e.getValue())) % mod; + } + long ans = cur; + for (int i = k; i < nums.length; ++i) { + int a = nums[i - k]; + int b = nums[i]; + if (a != b) { + if (cnt.getOrDefault(b, 0) > 0) { + cur += (b - 1) * qpow(b, cnt.get(b)) % mod; + } else { + cur += b; + } + if (cnt.getOrDefault(a, 0) > 1) { + cur -= (a - 1) * qpow(a, cnt.get(a) - 1) % mod; + } else { + cur -= a; + } + cur = (cur + mod) % mod; + cnt.put(b, cnt.getOrDefault(b, 0) + 1); + cnt.put(a, cnt.getOrDefault(a, 0) - 1); + ans = Math.max(ans, cur); + } + } + return (int) ans; + } + + private long 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 ans; + } } \ No newline at end of file diff --git a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/README.md b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/README.md index 52e81045616a8..8eadb5d49cfdf 100644 --- a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/README.md +++ b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/README.md @@ -85,19 +85,18 @@ class Solution: class Solution { public int monkeyMove(int n) { final int mod = (int) 1e9 + 7; - return (int) (qmi(2, n, mod) - 2 + mod) % mod; + return (qpow(2, n, mod) - 2 + mod) % mod; } - public 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, int 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 (int) ans; } } ``` @@ -109,19 +108,18 @@ class Solution { public: int monkeyMove(int n) { const int mod = 1e9 + 7; - return (qmi(2, n, mod) - 2 + mod) % mod; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + using ll = long long; + auto qpow = [&](ll a, int 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; + }; + return (qpow(2, n) - 2 + mod) % mod; } }; ``` @@ -131,19 +129,17 @@ public: ```go func monkeyMove(n int) int { const mod = 1e9 + 7 - return (qmi(2, n, mod) - 2 + mod) % mod -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p + 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 } - k >>= 1 - a = a * a % p + return ans } - return res + return (qpow(2, n) - 2 + mod) % mod } ``` @@ -151,20 +147,18 @@ func qmi(a, k, p int) int { ```ts function monkeyMove(n: number): number { - const mod = BigInt(10 ** 9 + 7); - return Number((qmi(2n, n, mod) - 2n + mod) % mod); -} - -function qmi(a: bigint, k: number, p: bigint): bigint { - let res = 1n; - while (k) { - if ((k & 1) === 1) { - res = (res * a) % p; + const mod = 10 ** 9 + 7; + const qpow = (a: number, n: number): number => { + let ans = 1n; + for (; n; n >>>= 1) { + if (n & 1) { + ans = (ans * BigInt(a)) % BigInt(mod); + } + a = Number((BigInt(a) * BigInt(a)) % BigInt(mod)); } - k >>= 1; - a = (a * a) % p; - } - return res; + return Number(ans); + }; + return (qpow(2, n) - 2 + mod) % mod; } ``` diff --git a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/README_EN.md b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/README_EN.md index 15295183633e1..47e0f7074ba71 100644 --- a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/README_EN.md +++ b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/README_EN.md @@ -66,19 +66,18 @@ class Solution: class Solution { public int monkeyMove(int n) { final int mod = (int) 1e9 + 7; - return (int) (qmi(2, n, mod) - 2 + mod) % mod; + return (qpow(2, n, mod) - 2 + mod) % mod; } - public 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, int 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 (int) ans; } } ``` @@ -90,19 +89,18 @@ class Solution { public: int monkeyMove(int n) { const int mod = 1e9 + 7; - return (qmi(2, n, mod) - 2 + mod) % mod; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + using ll = long long; + auto qpow = [&](ll a, int 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; + }; + return (qpow(2, n) - 2 + mod) % mod; } }; ``` @@ -112,19 +110,17 @@ public: ```go func monkeyMove(n int) int { const mod = 1e9 + 7 - return (qmi(2, n, mod) - 2 + mod) % mod -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p + 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 } - k >>= 1 - a = a * a % p + return ans } - return res + return (qpow(2, n) - 2 + mod) % mod } ``` @@ -132,20 +128,18 @@ func qmi(a, k, p int) int { ```ts function monkeyMove(n: number): number { - const mod = BigInt(10 ** 9 + 7); - return Number((qmi(2n, n, mod) - 2n + mod) % mod); -} - -function qmi(a: bigint, k: number, p: bigint): bigint { - let res = 1n; - while (k) { - if ((k & 1) === 1) { - res = (res * a) % p; + const mod = 10 ** 9 + 7; + const qpow = (a: number, n: number): number => { + let ans = 1n; + for (; n; n >>>= 1) { + if (n & 1) { + ans = (ans * BigInt(a)) % BigInt(mod); + } + a = Number((BigInt(a) * BigInt(a)) % BigInt(mod)); } - k >>= 1; - a = (a * a) % p; - } - return res; + return Number(ans); + }; + return (qpow(2, n) - 2 + mod) % mod; } ``` diff --git a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.cpp b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.cpp index e71da7dde828b..f1208c5645611 100644 --- a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.cpp +++ b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.cpp @@ -1,19 +1,18 @@ -class Solution { -public: - int monkeyMove(int n) { - const int mod = 1e9 + 7; - return (qmi(2, n, mod) - 2 + 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 monkeyMove(int n) { + const int mod = 1e9 + 7; + using ll = long long; + auto qpow = [&](ll a, int n) { + ll ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return ans; + }; + return (qpow(2, n) - 2 + mod) % mod; + } }; \ No newline at end of file diff --git a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.go b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.go index 90b80d54a7780..c5bac4cb8c1f6 100644 --- a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.go +++ b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.go @@ -1,16 +1,14 @@ func monkeyMove(n int) int { const mod = 1e9 + 7 - return (qmi(2, n, mod) - 2 + mod) % mod -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p + 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 } - k >>= 1 - a = a * a % p + return ans } - return res + return (qpow(2, n) - 2 + mod) % mod } \ No newline at end of file diff --git a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.java b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.java index 8ef6455d7a79d..54eb03771b345 100644 --- a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.java +++ b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.java @@ -1,18 +1,17 @@ -class Solution { - public int monkeyMove(int n) { - final int mod = (int) 1e9 + 7; - return (int) (qmi(2, n, mod) - 2 + mod) % mod; - } - - public 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 monkeyMove(int n) { + final int mod = (int) 1e9 + 7; + return (qpow(2, n, mod) - 2 + mod) % mod; + } + + private int qpow(long a, int n, int mod) { + 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/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.ts b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.ts index d1600f696654f..f56c7f021a26c 100644 --- a/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.ts +++ b/solution/2500-2599/2550.Count Collisions of Monkeys on a Polygon/Solution.ts @@ -1,16 +1,14 @@ function monkeyMove(n: number): number { - const mod = BigInt(10 ** 9 + 7); - return Number((qmi(2n, n, mod) - 2n + mod) % mod); -} - -function qmi(a: bigint, k: number, p: bigint): bigint { - let res = 1n; - while (k) { - if ((k & 1) === 1) { - res = (res * a) % p; + const mod = 10 ** 9 + 7; + const qpow = (a: number, n: number): number => { + let ans = 1n; + for (; n; n >>>= 1) { + if (n & 1) { + ans = (ans * BigInt(a)) % BigInt(mod); + } + a = Number((BigInt(a) * BigInt(a)) % BigInt(mod)); } - k >>= 1; - a = (a * a) % p; - } - return res; + return Number(ans); + }; + return (qpow(2, n) - 2 + mod) % mod; } diff --git a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/README.md b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/README.md index 635d8b61d8cf8..b398eb675a56a 100644 --- a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/README.md +++ b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/README.md @@ -122,19 +122,18 @@ class Solution { } mx = Math.max(mx, e[1]); } - return qmi(2, cnt, (int) 1e9 + 7); + return qpow(2, cnt, (int) 1e9 + 7); } - int qmi(long a, long k, int p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + private int qpow(long a, int 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 (int) res; + return (int) ans; } } ``` @@ -169,19 +168,18 @@ public: cnt += e[0] > mx; mx = max(mx, e[1]); } - return qmi(2, cnt, 1e9 + 7); - } - - int qmi(long a, long k, int p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + using ll = long long; + auto qpow = [&](ll a, int n, int mod) { + 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; + }; + return qpow(2, cnt, 1e9 + 7); } }; ``` @@ -218,19 +216,17 @@ func countWays(ranges [][]int) int { mx = e[1] } } - return qmi(2, cnt, 1e9+7) -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p + qpow := func(a, n, mod int) int { + ans := 1 + for ; n > 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 + return qpow(2, cnt, 1e9+7) } ``` diff --git a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/README_EN.md b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/README_EN.md index 13068dc4ae36f..3983cc53fe977 100644 --- a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/README_EN.md +++ b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/README_EN.md @@ -104,19 +104,18 @@ class Solution { } mx = Math.max(mx, e[1]); } - return qmi(2, cnt, (int) 1e9 + 7); + return qpow(2, cnt, (int) 1e9 + 7); } - int qmi(long a, long k, int p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + private int qpow(long a, int 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 (int) res; + return (int) ans; } } ``` @@ -151,19 +150,18 @@ public: cnt += e[0] > mx; mx = max(mx, e[1]); } - return qmi(2, cnt, 1e9 + 7); - } - - int qmi(long a, long k, int p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + using ll = long long; + auto qpow = [&](ll a, int n, int mod) { + 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; + }; + return qpow(2, cnt, 1e9 + 7); } }; ``` @@ -200,19 +198,17 @@ func countWays(ranges [][]int) int { mx = e[1] } } - return qmi(2, cnt, 1e9+7) -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p + qpow := func(a, n, mod int) int { + ans := 1 + for ; n > 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 + return qpow(2, cnt, 1e9+7) } ``` diff --git a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.cpp b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.cpp index 5a1bfcd465114..ee32b2d974ece 100644 --- a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.cpp +++ b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.cpp @@ -1,24 +1,23 @@ -class Solution { -public: - int countWays(vector>& ranges) { - sort(ranges.begin(), ranges.end()); - int cnt = 0, mx = -1; - for (auto& e : ranges) { - cnt += e[0] > mx; - mx = max(mx, e[1]); - } - return qmi(2, cnt, 1e9 + 7); - } - - int qmi(long a, long k, int 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 countWays(vector>& ranges) { + sort(ranges.begin(), ranges.end()); + int cnt = 0, mx = -1; + for (auto& e : ranges) { + cnt += e[0] > mx; + mx = max(mx, e[1]); + } + using ll = long long; + auto qpow = [&](ll a, int n, int mod) { + ll ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return ans; + }; + return qpow(2, cnt, 1e9 + 7); + } }; \ No newline at end of file diff --git a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.go b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.go index 5f292d577f9e2..57713e894a75c 100644 --- a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.go +++ b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.go @@ -9,17 +9,15 @@ func countWays(ranges [][]int) int { mx = e[1] } } - return qmi(2, cnt, 1e9+7) -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p + qpow := func(a, n, mod int) int { + ans := 1 + for ; n > 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 + return qpow(2, cnt, 1e9+7) } \ No newline at end of file diff --git a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.java b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.java index 817898d447ce2..9ee8a50921283 100644 --- a/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.java +++ b/solution/2500-2599/2580.Count Ways to Group Overlapping Ranges/Solution.java @@ -1,25 +1,24 @@ -class Solution { - public int countWays(int[][] ranges) { - Arrays.sort(ranges, (a, b) -> a[0] - b[0]); - int cnt = 0, mx = -1; - for (int[] e : ranges) { - if (e[0] > mx) { - ++cnt; - } - mx = Math.max(mx, e[1]); - } - return qmi(2, cnt, (int) 1e9 + 7); - } - - int qmi(long a, long k, int p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; - } - k >>= 1; - a = a * a % p; - } - return (int) res; - } +class Solution { + public int countWays(int[][] ranges) { + Arrays.sort(ranges, (a, b) -> a[0] - b[0]); + int cnt = 0, mx = -1; + for (int[] e : ranges) { + if (e[0] > mx) { + ++cnt; + } + mx = Math.max(mx, e[1]); + } + return qpow(2, cnt, (int) 1e9 + 7); + } + + private int qpow(long a, int n, int mod) { + 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/2800-2899/2818.Apply Operations to Maximize Score/README.md b/solution/2800-2899/2818.Apply Operations to Maximize Score/README.md index b684a90136951..cbf99391536d0 100644 --- a/solution/2800-2899/2818.Apply Operations to Maximize Score/README.md +++ b/solution/2800-2899/2818.Apply Operations to Maximize Score/README.md @@ -142,7 +142,7 @@ class Solution { int n = nums.size(); int[][] arr = new int[n][0]; for (int i = 0; i < n; ++i) { - arr[i] = new int[]{i, primeFactors(nums.get(i)), nums.get(i)}; + arr[i] = new int[] {i, primeFactors(nums.get(i)), nums.get(i)}; } int[] left = new int[n]; int[] right = new int[n]; @@ -177,10 +177,10 @@ class Solution { int l = left[i], r = right[i]; long cnt = (long) (i - l) * (r - i); if (cnt <= k) { - ans = ans * qmi(x, cnt, mod) % mod; + ans = ans * qpow(x, cnt) % mod; k -= cnt; } else { - ans = ans * qmi(x, k, mod) % mod; + ans = ans * qpow(x, k) % mod; break; } } @@ -203,16 +203,15 @@ class Solution { return ans.size(); } - private int qmi(long a, long k, int 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 (int) res; + return (int) ans; } } ``` @@ -256,14 +255,24 @@ public: return get<2>(rhs) < get<2>(lhs); }); long long ans = 1; + auto qpow = [&](long long a, int n) { + long long ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return ans; + }; for (auto [i, _, x] : arr) { int l = left[i], r = right[i]; long long cnt = 1LL * (i - l) * (r - i); if (cnt <= k) { - ans = ans * qmi(x, cnt, mod) % mod; + ans = ans * qpow(x, cnt) % mod; k -= cnt; } else { - ans = ans * qmi(x, k, mod) % mod; + ans = ans * qpow(x, k) % mod; break; } } @@ -285,18 +294,6 @@ public: } return ans.size(); } - - 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; - } }; ``` @@ -306,6 +303,16 @@ public: func maximumScore(nums []int, k int) int { n := len(nums) 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 + } arr := make([][3]int, n) left := make([]int, n) right := make([]int, n) @@ -343,10 +350,10 @@ func maximumScore(nums []int, k int) int { l, r := left[i], right[i] cnt := (i - l) * (r - i) if cnt <= k { - ans = ans * qmi(x, cnt, mod) % mod + ans = ans * qpow(x, cnt) % mod k -= cnt } else { - ans = ans * qmi(x, k, mod) % mod + ans = ans * qpow(x, k) % mod break } } @@ -368,18 +375,6 @@ func primeFactors(n int) int { } return len(ans) } - -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 -} ``` ### **TypeScript** @@ -424,10 +419,10 @@ function maximumScore(nums: number[], k: number): number { const r = right[i]; const cnt = (i - l) * (r - i); if (cnt <= k) { - ans = (ans * qmi(BigInt(x), cnt, BigInt(mod))) % BigInt(mod); + ans = (ans * qpow(BigInt(x), cnt, mod)) % BigInt(mod); k -= cnt; } else { - ans = (ans * qmi(BigInt(x), k, BigInt(mod))) % BigInt(mod); + ans = (ans * qpow(BigInt(x), k, mod)) % BigInt(mod); break; } } @@ -450,16 +445,15 @@ function primeFactors(n: number): number { return s.size; } -function qmi(a: bigint, k: number, p: bigint): bigint { - let res = 1n; - while (k) { - if ((k & 1) === 1) { - res = (res * a) % p; +function qpow(a: bigint, n: number, mod: number): bigint { + let ans = 1n; + for (; n; n >>>= 1) { + if (n & 1) { + ans = (ans * a) % BigInt(mod); } - k >>= 1; - a = (a * a) % p; + a = (a * a) % BigInt(mod); } - return res; + return ans; } ``` diff --git a/solution/2800-2899/2818.Apply Operations to Maximize Score/README_EN.md b/solution/2800-2899/2818.Apply Operations to Maximize Score/README_EN.md index a1ac1dac4e9f8..3d2f016d89573 100644 --- a/solution/2800-2899/2818.Apply Operations to Maximize Score/README_EN.md +++ b/solution/2800-2899/2818.Apply Operations to Maximize Score/README_EN.md @@ -132,7 +132,7 @@ class Solution { int n = nums.size(); int[][] arr = new int[n][0]; for (int i = 0; i < n; ++i) { - arr[i] = new int[]{i, primeFactors(nums.get(i)), nums.get(i)}; + arr[i] = new int[] {i, primeFactors(nums.get(i)), nums.get(i)}; } int[] left = new int[n]; int[] right = new int[n]; @@ -167,10 +167,10 @@ class Solution { int l = left[i], r = right[i]; long cnt = (long) (i - l) * (r - i); if (cnt <= k) { - ans = ans * qmi(x, cnt, mod) % mod; + ans = ans * qpow(x, cnt) % mod; k -= cnt; } else { - ans = ans * qmi(x, k, mod) % mod; + ans = ans * qpow(x, k) % mod; break; } } @@ -193,16 +193,15 @@ class Solution { return ans.size(); } - private int qmi(long a, long k, int 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 (int) res; + return (int) ans; } } ``` @@ -246,14 +245,24 @@ public: return get<2>(rhs) < get<2>(lhs); }); long long ans = 1; + auto qpow = [&](long long a, int n) { + long long ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return ans; + }; for (auto [i, _, x] : arr) { int l = left[i], r = right[i]; long long cnt = 1LL * (i - l) * (r - i); if (cnt <= k) { - ans = ans * qmi(x, cnt, mod) % mod; + ans = ans * qpow(x, cnt) % mod; k -= cnt; } else { - ans = ans * qmi(x, k, mod) % mod; + ans = ans * qpow(x, k) % mod; break; } } @@ -275,18 +284,6 @@ public: } return ans.size(); } - - 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; - } }; ``` @@ -296,6 +293,16 @@ public: func maximumScore(nums []int, k int) int { n := len(nums) 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 + } arr := make([][3]int, n) left := make([]int, n) right := make([]int, n) @@ -333,10 +340,10 @@ func maximumScore(nums []int, k int) int { l, r := left[i], right[i] cnt := (i - l) * (r - i) if cnt <= k { - ans = ans * qmi(x, cnt, mod) % mod + ans = ans * qpow(x, cnt) % mod k -= cnt } else { - ans = ans * qmi(x, k, mod) % mod + ans = ans * qpow(x, k) % mod break } } @@ -358,18 +365,6 @@ func primeFactors(n int) int { } return len(ans) } - -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 -} ``` ### **TypeScript** @@ -414,10 +409,10 @@ function maximumScore(nums: number[], k: number): number { const r = right[i]; const cnt = (i - l) * (r - i); if (cnt <= k) { - ans = (ans * qmi(BigInt(x), cnt, BigInt(mod))) % BigInt(mod); + ans = (ans * qpow(BigInt(x), cnt, mod)) % BigInt(mod); k -= cnt; } else { - ans = (ans * qmi(BigInt(x), k, BigInt(mod))) % BigInt(mod); + ans = (ans * qpow(BigInt(x), k, mod)) % BigInt(mod); break; } } @@ -440,16 +435,15 @@ function primeFactors(n: number): number { return s.size; } -function qmi(a: bigint, k: number, p: bigint): bigint { - let res = 1n; - while (k) { - if ((k & 1) === 1) { - res = (res * a) % p; +function qpow(a: bigint, n: number, mod: number): bigint { + let ans = 1n; + for (; n; n >>>= 1) { + if (n & 1) { + ans = (ans * a) % BigInt(mod); } - k >>= 1; - a = (a * a) % p; + a = (a * a) % BigInt(mod); } - return res; + return ans; } ``` diff --git a/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.cpp b/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.cpp index b3cedc4b3608a..5dd4297032ef9 100644 --- a/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.cpp +++ b/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.cpp @@ -34,14 +34,24 @@ class Solution { return get<2>(rhs) < get<2>(lhs); }); long long ans = 1; + auto qpow = [&](long long a, int n) { + long long ans = 1; + for (; n; n >>= 1) { + if (n & 1) { + ans = ans * a % mod; + } + a = a * a % mod; + } + return ans; + }; for (auto [i, _, x] : arr) { int l = left[i], r = right[i]; long long cnt = 1LL * (i - l) * (r - i); if (cnt <= k) { - ans = ans * qmi(x, cnt, mod) % mod; + ans = ans * qpow(x, cnt) % mod; k -= cnt; } else { - ans = ans * qmi(x, k, mod) % mod; + ans = ans * qpow(x, k) % mod; break; } } @@ -63,16 +73,4 @@ class Solution { } return ans.size(); } - - 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; - } }; \ No newline at end of file diff --git a/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.go b/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.go index 4edd82aa11f28..43e76c17382e7 100644 --- a/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.go +++ b/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.go @@ -1,6 +1,16 @@ func maximumScore(nums []int, k int) int { n := len(nums) 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 + } arr := make([][3]int, n) left := make([]int, n) right := make([]int, n) @@ -38,10 +48,10 @@ func maximumScore(nums []int, k int) int { l, r := left[i], right[i] cnt := (i - l) * (r - i) if cnt <= k { - ans = ans * qmi(x, cnt, mod) % mod + ans = ans * qpow(x, cnt) % mod k -= cnt } else { - ans = ans * qmi(x, k, mod) % mod + ans = ans * qpow(x, k) % mod break } } @@ -62,16 +72,4 @@ func primeFactors(n int) int { ans[n] = true } return len(ans) -} - -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 } \ No newline at end of file diff --git a/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.java b/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.java index 326984cb56f1a..04cf47eadcc29 100644 --- a/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.java +++ b/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.java @@ -40,10 +40,10 @@ public int maximumScore(List nums, int k) { int l = left[i], r = right[i]; long cnt = (long) (i - l) * (r - i); if (cnt <= k) { - ans = ans * qmi(x, cnt, mod) % mod; + ans = ans * qpow(x, cnt) % mod; k -= cnt; } else { - ans = ans * qmi(x, k, mod) % mod; + ans = ans * qpow(x, k) % mod; break; } } @@ -66,15 +66,14 @@ private int primeFactors(int n) { return ans.size(); } - private int qmi(long a, long k, int 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 (int) res; + return (int) ans; } } \ No newline at end of file diff --git a/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.ts b/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.ts index a01226eed2ed7..c1a804c007b90 100644 --- a/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.ts +++ b/solution/2800-2899/2818.Apply Operations to Maximize Score/Solution.ts @@ -37,10 +37,10 @@ function maximumScore(nums: number[], k: number): number { const r = right[i]; const cnt = (i - l) * (r - i); if (cnt <= k) { - ans = (ans * qmi(BigInt(x), cnt, BigInt(mod))) % BigInt(mod); + ans = (ans * qpow(BigInt(x), cnt, mod)) % BigInt(mod); k -= cnt; } else { - ans = (ans * qmi(BigInt(x), k, BigInt(mod))) % BigInt(mod); + ans = (ans * qpow(BigInt(x), k, mod)) % BigInt(mod); break; } } @@ -63,14 +63,13 @@ function primeFactors(n: number): number { return s.size; } -function qmi(a: bigint, k: number, p: bigint): bigint { - let res = 1n; - while (k) { - if ((k & 1) === 1) { - res = (res * a) % p; +function qpow(a: bigint, n: number, mod: number): bigint { + let ans = 1n; + for (; n; n >>>= 1) { + if (n & 1) { + ans = (ans * a) % BigInt(mod); } - k >>= 1; - a = (a * a) % p; + a = (a * a) % BigInt(mod); } - return res; + return ans; } diff --git a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/README.md b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/README.md index c899c7fcb62ec..41b3597a4b693 100644 --- a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/README.md +++ b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/README.md @@ -131,6 +131,8 @@ class Solution: ```java class Solution { + private final int mod = (int) 1e9 + 7; + public int countKSubsequencesWithMaxBeauty(String s, int k) { int[] f = new int[26]; int n = s.length(); @@ -150,7 +152,6 @@ class Solution { } } Arrays.sort(vs, (a, b) -> b - a); - final int mod = (int) 1e9 + 7; long ans = 1; int val = vs[k - 1]; int x = 0; @@ -173,20 +174,19 @@ class Solution { c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod; } } - ans = ((ans * c[x][k]) % mod) * qmi(val, k, mod) % mod; + ans = ((ans * c[x][k]) % mod) * qpow(val, k) % mod; return (int) ans; } - 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, int 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 ans; } } ``` @@ -236,20 +236,18 @@ public: c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; } } - ans = (ans * c[x][k] % mod) * qmi(val, k, mod) % mod; - return ans; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + auto qpow = [&](long long a, int n) { + long long 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; + }; + ans = (ans * c[x][k] % mod) * qpow(val, k) % mod; + return ans; } }; ``` @@ -302,20 +300,18 @@ func countKSubsequencesWithMaxBeauty(s string, k int) int { c[i][j] = (c[i-1][j-1] + c[i-1][j]) % mod } } - ans = (ans * c[x][k] % mod) * qmi(val, k, mod) % mod - return ans -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p + 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 } - k >>= 1 - a = a * a % p + return ans } - return res + ans = (ans * c[x][k] % mod) * qpow(val, k) % mod + return ans } ``` @@ -334,39 +330,37 @@ function countKSubsequencesWithMaxBeauty(s: string, k: number): number { if (cnt < k) { return 0; } - const mod = 1e9 + 7; + const mod = BigInt(10 ** 9 + 7); const vs: number[] = f.filter(v => v > 0).sort((a, b) => b - a); const val = vs[k - 1]; const x = vs.filter(v => v === val).length; - let ans = 1; + let ans = 1n; for (const v of vs) { if (v === val) { break; } --k; - ans = (ans * v) % mod; + ans = (ans * BigInt(v)) % mod; } const c: number[][] = new Array(x + 1).fill(0).map(() => new Array(k + 1).fill(0)); for (let i = 0; i <= x; ++i) { c[i][0] = 1; for (let j = 1; j <= Math.min(i, k); ++j) { - c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % Number(mod); } } - ans = (((ans * c[x][k]) % mod) * Number(qmi(BigInt(val), k, BigInt(mod)))) % mod; - return ans; -} - -function qmi(a: bigint, k: number, p: bigint): bigint { - let res = 1n; - while (k) { - if ((k & 1) === 1) { - res = (res * a) % p; + const qpow = (a: bigint, n: number): bigint => { + let ans = 1n; + for (; n; n >>>= 1) { + if (n & 1) { + ans = (ans * a) % BigInt(mod); + } + a = (a * a) % BigInt(mod); } - k >>= 1; - a = (a * a) % p; - } - return res; + return ans; + }; + ans = (((ans * BigInt(c[x][k])) % mod) * qpow(BigInt(val), k)) % mod; + return Number(ans); } ``` diff --git a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/README_EN.md b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/README_EN.md index 5a6b409300e83..ccad5cba1369c 100644 --- a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/README_EN.md +++ b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/README_EN.md @@ -105,6 +105,8 @@ class Solution: ```java class Solution { + private final int mod = (int) 1e9 + 7; + public int countKSubsequencesWithMaxBeauty(String s, int k) { int[] f = new int[26]; int n = s.length(); @@ -124,7 +126,6 @@ class Solution { } } Arrays.sort(vs, (a, b) -> b - a); - final int mod = (int) 1e9 + 7; long ans = 1; int val = vs[k - 1]; int x = 0; @@ -147,20 +148,19 @@ class Solution { c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod; } } - ans = ((ans * c[x][k]) % mod) * qmi(val, k, mod) % mod; + ans = ((ans * c[x][k]) % mod) * qpow(val, k) % mod; return (int) ans; } - 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, int 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 ans; } } ``` @@ -210,20 +210,18 @@ public: c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; } } - ans = (ans * c[x][k] % mod) * qmi(val, k, mod) % mod; - return ans; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + auto qpow = [&](long long a, int n) { + long long 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; + }; + ans = (ans * c[x][k] % mod) * qpow(val, k) % mod; + return ans; } }; ``` @@ -276,20 +274,18 @@ func countKSubsequencesWithMaxBeauty(s string, k int) int { c[i][j] = (c[i-1][j-1] + c[i-1][j]) % mod } } - ans = (ans * c[x][k] % mod) * qmi(val, k, mod) % mod - return ans -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p + 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 } - k >>= 1 - a = a * a % p + return ans } - return res + ans = (ans * c[x][k] % mod) * qpow(val, k) % mod + return ans } ``` @@ -308,39 +304,37 @@ function countKSubsequencesWithMaxBeauty(s: string, k: number): number { if (cnt < k) { return 0; } - const mod = 1e9 + 7; + const mod = BigInt(10 ** 9 + 7); const vs: number[] = f.filter(v => v > 0).sort((a, b) => b - a); const val = vs[k - 1]; const x = vs.filter(v => v === val).length; - let ans = 1; + let ans = 1n; for (const v of vs) { if (v === val) { break; } --k; - ans = (ans * v) % mod; + ans = (ans * BigInt(v)) % mod; } const c: number[][] = new Array(x + 1).fill(0).map(() => new Array(k + 1).fill(0)); for (let i = 0; i <= x; ++i) { c[i][0] = 1; for (let j = 1; j <= Math.min(i, k); ++j) { - c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % Number(mod); } } - ans = (((ans * c[x][k]) % mod) * Number(qmi(BigInt(val), k, BigInt(mod)))) % mod; - return ans; -} - -function qmi(a: bigint, k: number, p: bigint): bigint { - let res = 1n; - while (k) { - if ((k & 1) === 1) { - res = (res * a) % p; + const qpow = (a: bigint, n: number): bigint => { + let ans = 1n; + for (; n; n >>>= 1) { + if (n & 1) { + ans = (ans * a) % BigInt(mod); + } + a = (a * a) % BigInt(mod); } - k >>= 1; - a = (a * a) % p; - } - return res; + return ans; + }; + ans = (((ans * BigInt(c[x][k])) % mod) * qpow(BigInt(val), k)) % mod; + return Number(ans); } ``` diff --git a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.cpp b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.cpp index 37808ee8c0fe8..cff8e3d5d83aa 100644 --- a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.cpp +++ b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.cpp @@ -40,19 +40,17 @@ class Solution { c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; } } - ans = (ans * c[x][k] % mod) * qmi(val, k, mod) % mod; - return ans; - } - - long qmi(long a, long k, long p) { - long res = 1; - while (k != 0) { - if ((k & 1) == 1) { - res = res * a % p; + auto qpow = [&](long long a, int n) { + long long 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; + }; + ans = (ans * c[x][k] % mod) * qpow(val, k) % mod; + return ans; } }; \ No newline at end of file diff --git a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.go b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.go index 24ec234f04bd4..1a3ec16a68899 100644 --- a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.go +++ b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.go @@ -43,18 +43,16 @@ func countKSubsequencesWithMaxBeauty(s string, k int) int { c[i][j] = (c[i-1][j-1] + c[i-1][j]) % mod } } - ans = (ans * c[x][k] % mod) * qmi(val, k, mod) % mod - return ans -} - -func qmi(a, k, p int) int { - res := 1 - for k != 0 { - if k&1 == 1 { - res = res * a % p + 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 } - k >>= 1 - a = a * a % p + return ans } - return res + ans = (ans * c[x][k] % mod) * qpow(val, k) % mod + return ans } \ No newline at end of file diff --git a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.java b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.java index 6c8da303d3222..6799d5a5926e8 100644 --- a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.java +++ b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.java @@ -1,4 +1,6 @@ class Solution { + private final int mod = (int) 1e9 + 7; + public int countKSubsequencesWithMaxBeauty(String s, int k) { int[] f = new int[26]; int n = s.length(); @@ -18,7 +20,6 @@ public int countKSubsequencesWithMaxBeauty(String s, int k) { } } Arrays.sort(vs, (a, b) -> b - a); - final int mod = (int) 1e9 + 7; long ans = 1; int val = vs[k - 1]; int x = 0; @@ -41,19 +42,18 @@ public int countKSubsequencesWithMaxBeauty(String s, int k) { c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod; } } - ans = ((ans * c[x][k]) % mod) * qmi(val, k, mod) % mod; + ans = ((ans * c[x][k]) % mod) * qpow(val, k) % mod; return (int) ans; } - 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, int 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 ans; } } \ No newline at end of file diff --git a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.ts b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.ts index ff3dd803ef087..2627c86bb2411 100644 --- a/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.ts +++ b/solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/Solution.ts @@ -10,37 +10,35 @@ function countKSubsequencesWithMaxBeauty(s: string, k: number): number { if (cnt < k) { return 0; } - const mod = 1e9 + 7; + const mod = BigInt(10 ** 9 + 7); const vs: number[] = f.filter(v => v > 0).sort((a, b) => b - a); const val = vs[k - 1]; const x = vs.filter(v => v === val).length; - let ans = 1; + let ans = 1n; for (const v of vs) { if (v === val) { break; } --k; - ans = (ans * v) % mod; + ans = (ans * BigInt(v)) % mod; } const c: number[][] = new Array(x + 1).fill(0).map(() => new Array(k + 1).fill(0)); for (let i = 0; i <= x; ++i) { c[i][0] = 1; for (let j = 1; j <= Math.min(i, k); ++j) { - c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % Number(mod); } } - ans = (((ans * c[x][k]) % mod) * Number(qmi(BigInt(val), k, BigInt(mod)))) % mod; - return ans; -} - -function qmi(a: bigint, k: number, p: bigint): bigint { - let res = 1n; - while (k) { - if ((k & 1) === 1) { - res = (res * a) % p; + const qpow = (a: bigint, n: number): bigint => { + let ans = 1n; + for (; n; n >>>= 1) { + if (n & 1) { + ans = (ans * a) % BigInt(mod); + } + a = (a * a) % BigInt(mod); } - k >>= 1; - a = (a * a) % p; - } - return res; + return ans; + }; + ans = (((ans * BigInt(c[x][k])) % mod) * qpow(BigInt(val), k)) % mod; + return Number(ans); }