From c59f56fb4047bdd7b60b626fd32a4ae3dd5b80ba Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:49:10 +0800 Subject: [PATCH 01/13] feat: update solution to lc problem: No.2338 --- .../README.md | 313 ++++++------------ 1 file changed, 102 insertions(+), 211 deletions(-) diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/README.md b/solution/2300-2399/2338.Count the Number of Ideal Arrays/README.md index c1275bf4e2c24..28ad2cb2a1336 100644 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/README.md +++ b/solution/2300-2399/2338.Count the Number of Ideal Arrays/README.md @@ -53,7 +53,7 @@ tags: 输出:11 解释:存在以下理想数组: - 以 1 开头的数组(9 个): - - 不含其他不同值(1 个):[1,1,1,1,1] + - 不含其他不同值(1 个):[1,1,1,1,1] - 含一个不同值 2(4 个):[1,1,1,1,2], [1,1,1,2,2], [1,1,2,2,2], [1,2,2,2,2] - 含一个不同值 3(4 个):[1,1,1,1,3], [1,1,1,3,3], [1,1,3,3,3], [1,3,3,3,3] - 以 2 开头的数组(1 个):[2,2,2,2,2] @@ -76,180 +76,22 @@ tags: -### 方法一:记忆化搜索 + 组合计数 +### 方法一:动态规划 - - -#### Python3 - -```python -class Solution: - def idealArrays(self, n: int, maxValue: int) -> int: - @cache - def dfs(i, cnt): - res = c[-1][cnt - 1] - if cnt < n: - k = 2 - while k * i <= maxValue: - res = (res + dfs(k * i, cnt + 1)) % mod - k += 1 - return res - - c = [[0] * 16 for _ in range(n)] - mod = 10**9 + 7 - for i in range(n): - for j in range(min(16, i + 1)): - c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod - ans = 0 - for i in range(1, maxValue + 1): - ans = (ans + dfs(i, 1)) % mod - return ans -``` - -#### Java - -```java -class Solution { - private int[][] f; - private int[][] c; - private int n; - private int m; - private static final int MOD = (int) 1e9 + 7; - - public int idealArrays(int n, int maxValue) { - this.n = n; - this.m = maxValue; - this.f = new int[maxValue + 1][16]; - for (int[] row : f) { - Arrays.fill(row, -1); - } - c = new int[n][16]; - for (int i = 0; i < n; ++i) { - for (int j = 0; j <= i && j < 16; ++j) { - c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD; - } - } - int ans = 0; - for (int i = 1; i <= m; ++i) { - ans = (ans + dfs(i, 1)) % MOD; - } - return ans; - } +设 $f[i][j]$ 表示以 $i$ 结尾,且由 $j$ 个不同元素构成的序列的方案数。初始值 $f[i][1]=1$。 - private int dfs(int i, int cnt) { - if (f[i][cnt] != -1) { - return f[i][cnt]; - } - int res = c[n - 1][cnt - 1]; - if (cnt < n) { - for (int k = 2; k * i <= m; ++k) { - res = (res + dfs(k * i, cnt + 1)) % MOD; - } - } - f[i][cnt] = res; - return res; - } -} -``` +考虑 $n$ 个小球,最终划分为 $j$ 份,那么可以用“隔板法”,即在 $n-1$ 个位置上插入 $j-1$ 个隔板,那么组合数为 $c_{n-1}^{j-1}$。 -#### C++ +我们可以预处理组合数 $c[i][j]$,根据递推公式 $c[i][j]=c[i-1][j]+c[i-1][j-1]$ 求得,特别地,当 $j=0$ 时,$c[i][j]=1$。 -```cpp -class Solution { -public: - int m, n; - const int mod = 1e9 + 7; - vector> f; - vector> c; - - int idealArrays(int n, int maxValue) { - this->m = maxValue; - this->n = n; - f.assign(maxValue + 1, vector(16, -1)); - c.assign(n, vector(16, 0)); - for (int i = 0; i < n; ++i) - for (int j = 0; j <= i && j < 16; ++j) - c[i][j] = !j ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod; - int ans = 0; - for (int i = 1; i <= m; ++i) ans = (ans + dfs(i, 1)) % mod; - return ans; - } +最终的答案为 +$$ +\sum\limits_{i=1}^{k}\sum\limits_{j=1}^{\log_2 k + 1} f[i][j] \times c_{n-1}^{j-1} +$$ - int dfs(int i, int cnt) { - if (f[i][cnt] != -1) return f[i][cnt]; - int res = c[n - 1][cnt - 1]; - if (cnt < n) - for (int k = 2; k * i <= m; ++k) - res = (res + dfs(k * i, cnt + 1)) % mod; - f[i][cnt] = res; - return res; - } -}; -``` +其中 $k$ 表示数组的最大值,即 $\textit{maxValue}$。 -#### Go - -```go -func idealArrays(n int, maxValue int) int { - mod := int(1e9) + 7 - m := maxValue - c := make([][]int, n) - f := make([][]int, m+1) - for i := range c { - c[i] = make([]int, 16) - } - for i := range f { - f[i] = make([]int, 16) - for j := range f[i] { - f[i][j] = -1 - } - } - var dfs func(int, int) int - dfs = func(i, cnt int) int { - if f[i][cnt] != -1 { - return f[i][cnt] - } - res := c[n-1][cnt-1] - if cnt < n { - for k := 2; k*i <= m; k++ { - res = (res + dfs(k*i, cnt+1)) % mod - } - } - f[i][cnt] = res - return res - } - for i := 0; i < n; i++ { - for j := 0; j <= i && j < 16; j++ { - if j == 0 { - c[i][j] = 1 - } else { - c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod - } - } - } - ans := 0 - for i := 1; i <= m; i++ { - ans = (ans + dfs(i, 1)) % mod - } - return ans -} -``` - - - - - - - -### 方法二:动态规划 - -设 $dp[i][j]$ 表示以 $i$ 结尾,且由 $j$ 个不同元素构成的序列的方案数。初始值 $dp[i][1]=1$。 - -考虑 $n$ 个小球,最终划分为 $j$ 份,那么可以用“隔板法”,即在 $n-1$ 个位置上插入 $j-1$ 个隔板,那么组合数为 $C_{n-1}^{j-1}$ 。 - -我们可以预处理组合数 $C[i][j]$,根据递推公式 $C[i][j]=C[i-1][j]+C[i-1][j-1]$ 求得,特别地,当 $j=0$ 时,$C[i][j]=1$。 - -最终的答案为 $\sum\limits_{i=1}^{k}\sum\limits_{j=1}^{\log_2 k + 1}dp[i][j] \times C_{n-1}^{j-1}$ 。其中 $k$ 表示数组的最大值,即 $maxValue$。 +时间复杂度 $O(m \times \log^2 m)$,空间复杂度 $O(m \times \log m)$。 @@ -263,19 +105,19 @@ class Solution: for i in range(n): for j in range(min(16, i + 1)): c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod - dp = [[0] * 16 for _ in range(maxValue + 1)] + f = [[0] * 16 for _ in range(maxValue + 1)] for i in range(1, maxValue + 1): - dp[i][1] = 1 + f[i][1] = 1 for j in range(1, 15): for i in range(1, maxValue + 1): k = 2 while k * i <= maxValue: - dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod k += 1 ans = 0 for i in range(1, maxValue + 1): for j in range(1, 16): - ans = (ans + dp[i][j] * c[-1][j - 1]) % mod + ans = (ans + f[i][j] * c[-1][j - 1]) % mod return ans ``` @@ -283,31 +125,30 @@ class Solution: ```java class Solution { - private static final int MOD = (int) 1e9 + 7; - public int idealArrays(int n, int maxValue) { + final int mod = (int) 1e9 + 7; int[][] c = new int[n][16]; for (int i = 0; i < n; ++i) { for (int j = 0; j <= i && j < 16; ++j) { - c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD; + c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod; } } - long[][] dp = new long[maxValue + 1][16]; + long[][] f = new long[maxValue + 1][16]; for (int i = 1; i <= maxValue; ++i) { - dp[i][1] = 1; + f[i][1] = 1; } for (int j = 1; j < 15; ++j) { for (int i = 1; i <= maxValue; ++i) { int k = 2; for (; k * i <= maxValue; ++k) { - dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % MOD; + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod; } } } long ans = 0; for (int i = 1; i <= maxValue; ++i) { for (int j = 1; j < 16; ++j) { - ans = (ans + dp[i][j] * c[n - 1][j - 1]) % MOD; + ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod; } } return (int) ans; @@ -318,30 +159,42 @@ class Solution { #### C++ ```cpp -using ll = long long; - class Solution { public: - const int mod = 1e9 + 7; - int idealArrays(int n, int maxValue) { + const int mod = 1e9 + 7; vector> c(n, vector(16)); - for (int i = 0; i < n; ++i) - for (int j = 0; j <= i && j < 16; ++j) - c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod; - vector> dp(maxValue + 1, vector(16)); - for (int i = 1; i <= maxValue; ++i) dp[i][1] = 1; + for (int i = 0; i < n; ++i) { + for (int j = 0; j <= i && j < 16; ++j) { + if (j == 0) { + c[i][j] = 1; + } else { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; + } + } + } + + vector> f(maxValue + 1, vector(16)); + for (int i = 1; i <= maxValue; ++i) { + f[i][1] = 1; + } + for (int j = 1; j < 15; ++j) { for (int i = 1; i <= maxValue; ++i) { - int k = 2; - for (; k * i <= maxValue; ++k) dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod; + for (int k = 2; k * i <= maxValue; ++k) { + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod; + } } } - ll ans = 0; - for (int i = 1; i <= maxValue; ++i) - for (int j = 1; j < 16; ++j) - ans = (ans + dp[i][j] * c[n - 1][j - 1]) % mod; - return (int) ans; + + long long ans = 0; + for (int i = 1; i <= maxValue; ++i) { + for (int j = 1; j < 16; ++j) { + ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod; + } + } + + return ans; } }; ``` @@ -349,13 +202,11 @@ public: #### Go ```go -func idealArrays(n int, maxValue int) int { - mod := int(1e9) + 7 +func idealArrays(n int, maxValue int) (ans int) { + const mod = int(1e9 + 7) c := make([][]int, n) - for i := range c { - c[i] = make([]int, 16) - } for i := 0; i < n; i++ { + c[i] = make([]int, 16) for j := 0; j <= i && j < 16; j++ { if j == 0 { c[i][j] = 1 @@ -364,26 +215,66 @@ func idealArrays(n int, maxValue int) int { } } } - dp := make([][]int, maxValue+1) - for i := range dp { - dp[i] = make([]int, 16) - dp[i][1] = 1 + + f := make([][16]int, maxValue+1) + for i := 1; i <= maxValue; i++ { + f[i][1] = 1 } for j := 1; j < 15; j++ { for i := 1; i <= maxValue; i++ { - k := 2 - for ; k*i <= maxValue; k++ { - dp[k*i][j+1] = (dp[k*i][j+1] + dp[i][j]) % mod + for k := 2; k*i <= maxValue; k++ { + f[k*i][j+1] = (f[k*i][j+1] + f[i][j]) % mod } } } - ans := 0 + for i := 1; i <= maxValue; i++ { for j := 1; j < 16; j++ { - ans = (ans + dp[i][j]*c[n-1][j-1]) % mod + ans = (ans + f[i][j]*c[n-1][j-1]) % mod } } - return ans + return +} +``` + +#### TypeScript + +```ts +function idealArrays(n: number, maxValue: number): number { + const mod = 1e9 + 7; + + const c: number[][] = Array.from({ length: n }, () => Array(16).fill(0)); + for (let i = 0; i < n; i++) { + for (let j = 0; j <= i && j < 16; j++) { + if (j === 0) { + c[i][j] = 1; + } else { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; + } + } + } + + const f: number[][] = Array.from({ length: maxValue + 1 }, () => Array(16).fill(0)); + for (let i = 1; i <= maxValue; i++) { + f[i][1] = 1; + } + + for (let j = 1; j < 15; j++) { + for (let i = 1; i <= maxValue; i++) { + for (let k = 2; k * i <= maxValue; k++) { + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod; + } + } + } + + let ans = 0; + for (let i = 1; i <= maxValue; i++) { + for (let j = 1; j < 16; j++) { + ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod; + } + } + + return ans; } ``` From cabc125fb4475b006d5571d9b41f00d55eaf38ea Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:49:54 +0800 Subject: [PATCH 02/13] Update README_EN.md --- .../README_EN.md | 155 +++++++++++++----- 1 file changed, 110 insertions(+), 45 deletions(-) diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md b/solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md index 61eb5b4d8b0ba..c93f439733825 100644 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md +++ b/solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md @@ -53,8 +53,8 @@ There are a total of 5 + 2 + 1 + 1 + 1 = 10 distinct ideal arrays. Input: n = 5, maxValue = 3 Output: 11 Explanation: The following are the possible ideal arrays: -- Arrays starting with the value 1 (9 arrays): - - With no other distinct values (1 array): [1,1,1,1,1] +- Arrays starting with the value 1 (9 arrays): + - With no other distinct values (1 array): [1,1,1,1,1] - With 2nd distinct value 2 (4 arrays): [1,1,1,1,2], [1,1,1,2,2], [1,1,2,2,2], [1,2,2,2,2] - With 2nd distinct value 3 (4 arrays): [1,1,1,1,3], [1,1,1,3,3], [1,1,3,3,3], [1,3,3,3,3] - Arrays starting with the value 2 (1 array): [2,2,2,2,2] @@ -76,7 +76,23 @@ There are a total of 9 + 1 + 1 = 11 distinct ideal arrays. -### Solution 1 +### Solution 1: Dynamic Programming + +Let $f[i][j]$ represent the number of sequences ending with $i$ and consisting of $j$ distinct elements. The initial value is $f[i][1] = 1$. + +Consider $n$ balls, which are eventually divided into $j$ parts. Using the "separator method," we can insert $j-1$ separators into the $n-1$ positions, and the number of combinations is $c_{n-1}^{j-1}$. + +We can preprocess the combination numbers $c[i][j]$ using the recurrence relation $c[i][j] = c[i-1][j] + c[i-1][j-1]$. Specifically, when $j=0$, $c[i][j] = 1$. + +The final answer is: +\[ +\sum\limits_{i=1}^{k}\sum\limits_{j=1}^{\log_2 k + 1} f[i][j] \times c_{n-1}^{j-1} +\] + +where $k$ represents the maximum value of the array, i.e., $\textit{maxValue}$. + +- **Time Complexity**: $O(m \times \log^2 m)$ +- **Space Complexity**: $O(m \times \log m)$ @@ -255,19 +271,19 @@ class Solution: for i in range(n): for j in range(min(16, i + 1)): c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod - dp = [[0] * 16 for _ in range(maxValue + 1)] + f = [[0] * 16 for _ in range(maxValue + 1)] for i in range(1, maxValue + 1): - dp[i][1] = 1 + f[i][1] = 1 for j in range(1, 15): for i in range(1, maxValue + 1): k = 2 while k * i <= maxValue: - dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod k += 1 ans = 0 for i in range(1, maxValue + 1): for j in range(1, 16): - ans = (ans + dp[i][j] * c[-1][j - 1]) % mod + ans = (ans + f[i][j] * c[-1][j - 1]) % mod return ans ``` @@ -275,31 +291,30 @@ class Solution: ```java class Solution { - private static final int MOD = (int) 1e9 + 7; - public int idealArrays(int n, int maxValue) { + final int mod = (int) 1e9 + 7; int[][] c = new int[n][16]; for (int i = 0; i < n; ++i) { for (int j = 0; j <= i && j < 16; ++j) { - c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD; + c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod; } } - long[][] dp = new long[maxValue + 1][16]; + long[][] f = new long[maxValue + 1][16]; for (int i = 1; i <= maxValue; ++i) { - dp[i][1] = 1; + f[i][1] = 1; } for (int j = 1; j < 15; ++j) { for (int i = 1; i <= maxValue; ++i) { int k = 2; for (; k * i <= maxValue; ++k) { - dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % MOD; + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod; } } } long ans = 0; for (int i = 1; i <= maxValue; ++i) { for (int j = 1; j < 16; ++j) { - ans = (ans + dp[i][j] * c[n - 1][j - 1]) % MOD; + ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod; } } return (int) ans; @@ -310,30 +325,42 @@ class Solution { #### C++ ```cpp -using ll = long long; - class Solution { public: - const int mod = 1e9 + 7; - int idealArrays(int n, int maxValue) { + const int mod = 1e9 + 7; vector> c(n, vector(16)); - for (int i = 0; i < n; ++i) - for (int j = 0; j <= i && j < 16; ++j) - c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod; - vector> dp(maxValue + 1, vector(16)); - for (int i = 1; i <= maxValue; ++i) dp[i][1] = 1; + for (int i = 0; i < n; ++i) { + for (int j = 0; j <= i && j < 16; ++j) { + if (j == 0) { + c[i][j] = 1; + } else { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; + } + } + } + + vector> f(maxValue + 1, vector(16)); + for (int i = 1; i <= maxValue; ++i) { + f[i][1] = 1; + } + for (int j = 1; j < 15; ++j) { for (int i = 1; i <= maxValue; ++i) { - int k = 2; - for (; k * i <= maxValue; ++k) dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod; + for (int k = 2; k * i <= maxValue; ++k) { + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod; + } } } - ll ans = 0; - for (int i = 1; i <= maxValue; ++i) - for (int j = 1; j < 16; ++j) - ans = (ans + dp[i][j] * c[n - 1][j - 1]) % mod; - return (int) ans; + + long long ans = 0; + for (int i = 1; i <= maxValue; ++i) { + for (int j = 1; j < 16; ++j) { + ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod; + } + } + + return ans; } }; ``` @@ -341,13 +368,11 @@ public: #### Go ```go -func idealArrays(n int, maxValue int) int { - mod := int(1e9) + 7 +func idealArrays(n int, maxValue int) (ans int) { + const mod = int(1e9 + 7) c := make([][]int, n) - for i := range c { - c[i] = make([]int, 16) - } for i := 0; i < n; i++ { + c[i] = make([]int, 16) for j := 0; j <= i && j < 16; j++ { if j == 0 { c[i][j] = 1 @@ -356,26 +381,66 @@ func idealArrays(n int, maxValue int) int { } } } - dp := make([][]int, maxValue+1) - for i := range dp { - dp[i] = make([]int, 16) - dp[i][1] = 1 + + f := make([][16]int, maxValue+1) + for i := 1; i <= maxValue; i++ { + f[i][1] = 1 } for j := 1; j < 15; j++ { for i := 1; i <= maxValue; i++ { - k := 2 - for ; k*i <= maxValue; k++ { - dp[k*i][j+1] = (dp[k*i][j+1] + dp[i][j]) % mod + for k := 2; k*i <= maxValue; k++ { + f[k*i][j+1] = (f[k*i][j+1] + f[i][j]) % mod } } } - ans := 0 + for i := 1; i <= maxValue; i++ { for j := 1; j < 16; j++ { - ans = (ans + dp[i][j]*c[n-1][j-1]) % mod + ans = (ans + f[i][j]*c[n-1][j-1]) % mod } } - return ans + return +} +``` + +#### TypeScript + +```ts +function idealArrays(n: number, maxValue: number): number { + const mod = 1e9 + 7; + + const c: number[][] = Array.from({ length: n }, () => Array(16).fill(0)); + for (let i = 0; i < n; i++) { + for (let j = 0; j <= i && j < 16; j++) { + if (j === 0) { + c[i][j] = 1; + } else { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; + } + } + } + + const f: number[][] = Array.from({ length: maxValue + 1 }, () => Array(16).fill(0)); + for (let i = 1; i <= maxValue; i++) { + f[i][1] = 1; + } + + for (let j = 1; j < 15; j++) { + for (let i = 1; i <= maxValue; i++) { + for (let k = 2; k * i <= maxValue; k++) { + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod; + } + } + } + + let ans = 0; + for (let i = 1; i <= maxValue; i++) { + for (let j = 1; j < 16; j++) { + ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod; + } + } + + return ans; } ``` From 1677dcecf46e2be0082dc6d0ecee8711c0a6da05 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:51:16 +0800 Subject: [PATCH 03/13] Update Solution.py --- .../Solution.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.py b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.py index f1bdea6d5ea0b..62872e8ee1293 100644 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.py +++ b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.py @@ -1,21 +1,21 @@ class Solution: def idealArrays(self, n: int, maxValue: int) -> int: - @cache - def dfs(i, cnt): - res = c[-1][cnt - 1] - if cnt < n: - k = 2 - while k * i <= maxValue: - res = (res + dfs(k * i, cnt + 1)) % mod - k += 1 - return res - c = [[0] * 16 for _ in range(n)] mod = 10**9 + 7 for i in range(n): for j in range(min(16, i + 1)): c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod + f = [[0] * 16 for _ in range(maxValue + 1)] + for i in range(1, maxValue + 1): + f[i][1] = 1 + for j in range(1, 15): + for i in range(1, maxValue + 1): + k = 2 + while k * i <= maxValue: + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod + k += 1 ans = 0 for i in range(1, maxValue + 1): - ans = (ans + dfs(i, 1)) % mod + for j in range(1, 16): + ans = (ans + f[i][j] * c[-1][j - 1]) % mod return ans From 35e6972b0f8da8807885c5122d2ca55d85da14cd Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:51:35 +0800 Subject: [PATCH 04/13] Update Solution.java --- .../Solution.java | 49 +++++++------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.java b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.java index 587657b9eb505..89d1cc8cfcd8f 100644 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.java +++ b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.java @@ -1,41 +1,30 @@ class Solution { - private int[][] f; - private int[][] c; - private int n; - private int m; - private static final int MOD = (int) 1e9 + 7; - public int idealArrays(int n, int maxValue) { - this.n = n; - this.m = maxValue; - this.f = new int[maxValue + 1][16]; - for (int[] row : f) { - Arrays.fill(row, -1); - } - c = new int[n][16]; + final int mod = (int) 1e9 + 7; + int[][] c = new int[n][16]; for (int i = 0; i < n; ++i) { for (int j = 0; j <= i && j < 16; ++j) { - c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD; + c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod; } } - int ans = 0; - for (int i = 1; i <= m; ++i) { - ans = (ans + dfs(i, 1)) % MOD; + long[][] f = new long[maxValue + 1][16]; + for (int i = 1; i <= maxValue; ++i) { + f[i][1] = 1; } - return ans; - } - - private int dfs(int i, int cnt) { - if (f[i][cnt] != -1) { - return f[i][cnt]; + for (int j = 1; j < 15; ++j) { + for (int i = 1; i <= maxValue; ++i) { + int k = 2; + for (; k * i <= maxValue; ++k) { + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod; + } + } } - int res = c[n - 1][cnt - 1]; - if (cnt < n) { - for (int k = 2; k * i <= m; ++k) { - res = (res + dfs(k * i, cnt + 1)) % MOD; + long ans = 0; + for (int i = 1; i <= maxValue; ++i) { + for (int j = 1; j < 16; ++j) { + ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod; } } - f[i][cnt] = res; - return res; + return (int) ans; } -} \ No newline at end of file +} From d853f7337773061222d25b37bfa7227f05162962 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:52:17 +0800 Subject: [PATCH 05/13] Update Solution.cpp --- .../Solution.cpp | 58 +++++++++++-------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.cpp b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.cpp index cf6aa09ff0786..783a1bc4830be 100644 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.cpp +++ b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.cpp @@ -1,30 +1,38 @@ class Solution { public: - int m, n; - const int mod = 1e9 + 7; - vector> f; - vector> c; - int idealArrays(int n, int maxValue) { - this->m = maxValue; - this->n = n; - f.assign(maxValue + 1, vector(16, -1)); - c.assign(n, vector(16, 0)); - for (int i = 0; i < n; ++i) - for (int j = 0; j <= i && j < 16; ++j) - c[i][j] = !j ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod; - int ans = 0; - for (int i = 1; i <= m; ++i) ans = (ans + dfs(i, 1)) % mod; - return ans; - } + const int mod = 1e9 + 7; + vector> c(n, vector(16)); + for (int i = 0; i < n; ++i) { + for (int j = 0; j <= i && j < 16; ++j) { + if (j == 0) { + c[i][j] = 1; + } else { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; + } + } + } + + vector> f(maxValue + 1, vector(16)); + for (int i = 1; i <= maxValue; ++i) { + f[i][1] = 1; + } - int dfs(int i, int cnt) { - if (f[i][cnt] != -1) return f[i][cnt]; - int res = c[n - 1][cnt - 1]; - if (cnt < n) - for (int k = 2; k * i <= m; ++k) - res = (res + dfs(k * i, cnt + 1)) % mod; - f[i][cnt] = res; - return res; + for (int j = 1; j < 15; ++j) { + for (int i = 1; i <= maxValue; ++i) { + for (int k = 2; k * i <= maxValue; ++k) { + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod; + } + } + } + + long long ans = 0; + for (int i = 1; i <= maxValue; ++i) { + for (int j = 1; j < 16; ++j) { + ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod; + } + } + + return ans; } -}; \ No newline at end of file +}; From aa0f8526fc71934ab1b8b61278b584cae04d495a Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:53:16 +0800 Subject: [PATCH 06/13] Update Solution.go --- .../Solution.go | 54 ++++++++----------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.go b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.go index 17f483d049abb..e6b06c729f00e 100644 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.go +++ b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.go @@ -1,32 +1,8 @@ -func idealArrays(n int, maxValue int) int { - mod := int(1e9) + 7 - m := maxValue +func idealArrays(n int, maxValue int) (ans int) { + const mod = int(1e9 + 7) c := make([][]int, n) - f := make([][]int, m+1) - for i := range c { - c[i] = make([]int, 16) - } - for i := range f { - f[i] = make([]int, 16) - for j := range f[i] { - f[i][j] = -1 - } - } - var dfs func(int, int) int - dfs = func(i, cnt int) int { - if f[i][cnt] != -1 { - return f[i][cnt] - } - res := c[n-1][cnt-1] - if cnt < n { - for k := 2; k*i <= m; k++ { - res = (res + dfs(k*i, cnt+1)) % mod - } - } - f[i][cnt] = res - return res - } for i := 0; i < n; i++ { + c[i] = make([]int, 16) for j := 0; j <= i && j < 16; j++ { if j == 0 { c[i][j] = 1 @@ -35,9 +11,23 @@ func idealArrays(n int, maxValue int) int { } } } - ans := 0 - for i := 1; i <= m; i++ { - ans = (ans + dfs(i, 1)) % mod + + f := make([][16]int, maxValue+1) + for i := 1; i <= maxValue; i++ { + f[i][1] = 1 + } + for j := 1; j < 15; j++ { + for i := 1; i <= maxValue; i++ { + for k := 2; k*i <= maxValue; k++ { + f[k*i][j+1] = (f[k*i][j+1] + f[i][j]) % mod + } + } + } + + for i := 1; i <= maxValue; i++ { + for j := 1; j < 16; j++ { + ans = (ans + f[i][j]*c[n-1][j-1]) % mod + } } - return ans -} \ No newline at end of file + return +} From 933f86868c7c044a036e4a4ddd35688228effe3c Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:53:41 +0800 Subject: [PATCH 07/13] Create Solution.ts --- .../Solution.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.ts diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.ts b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.ts new file mode 100644 index 0000000000000..ed6b2c00054d7 --- /dev/null +++ b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution.ts @@ -0,0 +1,36 @@ +function idealArrays(n: number, maxValue: number): number { + const mod = 1e9 + 7; + + const c: number[][] = Array.from({ length: n }, () => Array(16).fill(0)); + for (let i = 0; i < n; i++) { + for (let j = 0; j <= i && j < 16; j++) { + if (j === 0) { + c[i][j] = 1; + } else { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod; + } + } + } + + const f: number[][] = Array.from({ length: maxValue + 1 }, () => Array(16).fill(0)); + for (let i = 1; i <= maxValue; i++) { + f[i][1] = 1; + } + + for (let j = 1; j < 15; j++) { + for (let i = 1; i <= maxValue; i++) { + for (let k = 2; k * i <= maxValue; k++) { + f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod; + } + } + } + + let ans = 0; + for (let i = 1; i <= maxValue; i++) { + for (let j = 1; j < 16; j++) { + ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod; + } + } + + return ans; +} From a0cab75b539720e8969526c08bbbb0f8f56e3b93 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:55:08 +0800 Subject: [PATCH 08/13] Delete solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.py --- .../Solution2.py | 21 ------------------- 1 file changed, 21 deletions(-) delete mode 100644 solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.py diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.py b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.py deleted file mode 100644 index de720e4b85941..0000000000000 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.py +++ /dev/null @@ -1,21 +0,0 @@ -class Solution: - def idealArrays(self, n: int, maxValue: int) -> int: - c = [[0] * 16 for _ in range(n)] - mod = 10**9 + 7 - for i in range(n): - for j in range(min(16, i + 1)): - c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod - dp = [[0] * 16 for _ in range(maxValue + 1)] - for i in range(1, maxValue + 1): - dp[i][1] = 1 - for j in range(1, 15): - for i in range(1, maxValue + 1): - k = 2 - while k * i <= maxValue: - dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod - k += 1 - ans = 0 - for i in range(1, maxValue + 1): - for j in range(1, 16): - ans = (ans + dp[i][j] * c[-1][j - 1]) % mod - return ans From f5c17eba6ff7c80451b86f40f6d44cd1124aeb35 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:55:20 +0800 Subject: [PATCH 09/13] Delete solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.java --- .../Solution2.java | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.java diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.java b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.java deleted file mode 100644 index 3f8c9315b4356..0000000000000 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.java +++ /dev/null @@ -1,31 +0,0 @@ -class Solution { - private static final int MOD = (int) 1e9 + 7; - - public int idealArrays(int n, int maxValue) { - int[][] c = new int[n][16]; - for (int i = 0; i < n; ++i) { - for (int j = 0; j <= i && j < 16; ++j) { - c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD; - } - } - long[][] dp = new long[maxValue + 1][16]; - for (int i = 1; i <= maxValue; ++i) { - dp[i][1] = 1; - } - for (int j = 1; j < 15; ++j) { - for (int i = 1; i <= maxValue; ++i) { - int k = 2; - for (; k * i <= maxValue; ++k) { - dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % MOD; - } - } - } - long ans = 0; - for (int i = 1; i <= maxValue; ++i) { - for (int j = 1; j < 16; ++j) { - ans = (ans + dp[i][j] * c[n - 1][j - 1]) % MOD; - } - } - return (int) ans; - } -} \ No newline at end of file From daba0c5a970bf5153851aa4d0f2cfb9ecb17b113 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:55:38 +0800 Subject: [PATCH 10/13] Delete solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.go --- .../Solution2.go | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.go diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.go b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.go deleted file mode 100644 index 0765f8b4411b3..0000000000000 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.go +++ /dev/null @@ -1,36 +0,0 @@ -func idealArrays(n int, maxValue int) int { - mod := int(1e9) + 7 - c := make([][]int, n) - for i := range c { - c[i] = make([]int, 16) - } - for i := 0; i < n; i++ { - for j := 0; j <= i && j < 16; j++ { - if j == 0 { - c[i][j] = 1 - } else { - c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod - } - } - } - dp := make([][]int, maxValue+1) - for i := range dp { - dp[i] = make([]int, 16) - dp[i][1] = 1 - } - for j := 1; j < 15; j++ { - for i := 1; i <= maxValue; i++ { - k := 2 - for ; k*i <= maxValue; k++ { - dp[k*i][j+1] = (dp[k*i][j+1] + dp[i][j]) % mod - } - } - } - ans := 0 - for i := 1; i <= maxValue; i++ { - for j := 1; j < 16; j++ { - ans = (ans + dp[i][j]*c[n-1][j-1]) % mod - } - } - return ans -} \ No newline at end of file From b2024e06f25822cc7983b4c32e15e7b8d7ae2a3e Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:55:55 +0800 Subject: [PATCH 11/13] Delete solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.cpp --- .../Solution2.cpp | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.cpp diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.cpp b/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.cpp deleted file mode 100644 index df0cf26cd2fe6..0000000000000 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/Solution2.cpp +++ /dev/null @@ -1,26 +0,0 @@ -using ll = long long; - -class Solution { -public: - const int mod = 1e9 + 7; - - int idealArrays(int n, int maxValue) { - vector> c(n, vector(16)); - for (int i = 0; i < n; ++i) - for (int j = 0; j <= i && j < 16; ++j) - c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod; - vector> dp(maxValue + 1, vector(16)); - for (int i = 1; i <= maxValue; ++i) dp[i][1] = 1; - for (int j = 1; j < 15; ++j) { - for (int i = 1; i <= maxValue; ++i) { - int k = 2; - for (; k * i <= maxValue; ++k) dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod; - } - } - ll ans = 0; - for (int i = 1; i <= maxValue; ++i) - for (int j = 1; j < 16; ++j) - ans = (ans + dp[i][j] * c[n - 1][j - 1]) % mod; - return (int) ans; - } -}; \ No newline at end of file From e835f3172bf1fb5a2c060c444e17fda355c177fb Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:56:21 +0800 Subject: [PATCH 12/13] Update README.md --- .../2300-2399/2338.Count the Number of Ideal Arrays/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/README.md b/solution/2300-2399/2338.Count the Number of Ideal Arrays/README.md index 28ad2cb2a1336..7835659c6285f 100644 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/README.md +++ b/solution/2300-2399/2338.Count the Number of Ideal Arrays/README.md @@ -85,6 +85,7 @@ tags: 我们可以预处理组合数 $c[i][j]$,根据递推公式 $c[i][j]=c[i-1][j]+c[i-1][j-1]$ 求得,特别地,当 $j=0$ 时,$c[i][j]=1$。 最终的答案为 + $$ \sum\limits_{i=1}^{k}\sum\limits_{j=1}^{\log_2 k + 1} f[i][j] \times c_{n-1}^{j-1} $$ From f002cd543507c572421cfe07e507645fe3f7aff0 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 22 Apr 2025 06:56:47 +0800 Subject: [PATCH 13/13] Update README_EN.md --- .../2338.Count the Number of Ideal Arrays/README_EN.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md b/solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md index c93f439733825..acc766b46b2ff 100644 --- a/solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md +++ b/solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md @@ -85,9 +85,10 @@ Consider $n$ balls, which are eventually divided into $j$ parts. Using the "sepa We can preprocess the combination numbers $c[i][j]$ using the recurrence relation $c[i][j] = c[i-1][j] + c[i-1][j-1]$. Specifically, when $j=0$, $c[i][j] = 1$. The final answer is: -\[ + +$$ \sum\limits_{i=1}^{k}\sum\limits_{j=1}^{\log_2 k + 1} f[i][j] \times c_{n-1}^{j-1} -\] +$$ where $k$ represents the maximum value of the array, i.e., $\textit{maxValue}$.