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..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
@@ -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,23 @@ 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;
- }
-
- 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;
- }
-}
-```
-
-#### C++
-
-```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;
- }
-
- 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;
- }
-};
-```
-
-#### 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
-}
-```
-
-
-
-
+设 $f[i][j]$ 表示以 $i$ 结尾,且由 $j$ 个不同元素构成的序列的方案数。初始值 $f[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$。
-设 $dp[i][j]$ 表示以 $i$ 结尾,且由 $j$ 个不同元素构成的序列的方案数。初始值 $dp[i][1]=1$。
+最终的答案为
-考虑 $n$ 个小球,最终划分为 $j$ 份,那么可以用“隔板法”,即在 $n-1$ 个位置上插入 $j-1$ 个隔板,那么组合数为 $C_{n-1}^{j-1}$ 。
+$$
+\sum\limits_{i=1}^{k}\sum\limits_{j=1}^{\log_2 k + 1} f[i][j] \times 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$。
+其中 $k$ 表示数组的最大值,即 $\textit{maxValue}$。
-最终的答案为 $\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 +106,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 +126,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 +160,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 +203,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 +216,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;
}
```
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..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
@@ -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,24 @@ 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 +272,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 +292,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 +326,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 +369,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 +382,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;
}
```
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
+};
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
+}
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
+}
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
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;
+}
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
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
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
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