Skip to content

Commit cabc125

Browse files
authored
Update README_EN.md
1 parent c59f56f commit cabc125

File tree

1 file changed

+110
-45
lines changed
  • solution/2300-2399/2338.Count the Number of Ideal Arrays

1 file changed

+110
-45
lines changed

solution/2300-2399/2338.Count the Number of Ideal Arrays/README_EN.md

+110-45
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ There are a total of 5 + 2 + 1 + 1 + 1 = 10 distinct ideal arrays.
5353
<strong>Input:</strong> n = 5, maxValue = 3
5454
<strong>Output:</strong> 11
5555
<strong>Explanation:</strong> The following are the possible ideal arrays:
56-
- Arrays starting with the value 1 (9 arrays):
57-
- With no other distinct values (1 array): [1,1,1,1,1]
56+
- Arrays starting with the value 1 (9 arrays):
57+
- With no other distinct values (1 array): [1,1,1,1,1]
5858
- With 2<sup>nd</sup> 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]
5959
- With 2<sup>nd</sup> 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]
6060
- 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.
7676

7777
<!-- solution:start -->
7878

79-
### Solution 1
79+
### Solution 1: Dynamic Programming
80+
81+
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$.
82+
83+
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}$.
84+
85+
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$.
86+
87+
The final answer is:
88+
\[
89+
\sum\limits_{i=1}^{k}\sum\limits_{j=1}^{\log_2 k + 1} f[i][j] \times c_{n-1}^{j-1}
90+
\]
91+
92+
where $k$ represents the maximum value of the array, i.e., $\textit{maxValue}$.
93+
94+
- **Time Complexity**: $O(m \times \log^2 m)$
95+
- **Space Complexity**: $O(m \times \log m)$
8096

8197
<!-- tabs:start -->
8298

@@ -255,51 +271,50 @@ class Solution:
255271
for i in range(n):
256272
for j in range(min(16, i + 1)):
257273
c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod
258-
dp = [[0] * 16 for _ in range(maxValue + 1)]
274+
f = [[0] * 16 for _ in range(maxValue + 1)]
259275
for i in range(1, maxValue + 1):
260-
dp[i][1] = 1
276+
f[i][1] = 1
261277
for j in range(1, 15):
262278
for i in range(1, maxValue + 1):
263279
k = 2
264280
while k * i <= maxValue:
265-
dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod
281+
f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod
266282
k += 1
267283
ans = 0
268284
for i in range(1, maxValue + 1):
269285
for j in range(1, 16):
270-
ans = (ans + dp[i][j] * c[-1][j - 1]) % mod
286+
ans = (ans + f[i][j] * c[-1][j - 1]) % mod
271287
return ans
272288
```
273289

274290
#### Java
275291

276292
```java
277293
class Solution {
278-
private static final int MOD = (int) 1e9 + 7;
279-
280294
public int idealArrays(int n, int maxValue) {
295+
final int mod = (int) 1e9 + 7;
281296
int[][] c = new int[n][16];
282297
for (int i = 0; i < n; ++i) {
283298
for (int j = 0; j <= i && j < 16; ++j) {
284-
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
299+
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod;
285300
}
286301
}
287-
long[][] dp = new long[maxValue + 1][16];
302+
long[][] f = new long[maxValue + 1][16];
288303
for (int i = 1; i <= maxValue; ++i) {
289-
dp[i][1] = 1;
304+
f[i][1] = 1;
290305
}
291306
for (int j = 1; j < 15; ++j) {
292307
for (int i = 1; i <= maxValue; ++i) {
293308
int k = 2;
294309
for (; k * i <= maxValue; ++k) {
295-
dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % MOD;
310+
f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod;
296311
}
297312
}
298313
}
299314
long ans = 0;
300315
for (int i = 1; i <= maxValue; ++i) {
301316
for (int j = 1; j < 16; ++j) {
302-
ans = (ans + dp[i][j] * c[n - 1][j - 1]) % MOD;
317+
ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod;
303318
}
304319
}
305320
return (int) ans;
@@ -310,44 +325,54 @@ class Solution {
310325
#### C++
311326

312327
```cpp
313-
using ll = long long;
314-
315328
class Solution {
316329
public:
317-
const int mod = 1e9 + 7;
318-
319330
int idealArrays(int n, int maxValue) {
331+
const int mod = 1e9 + 7;
320332
vector<vector<int>> c(n, vector<int>(16));
321-
for (int i = 0; i < n; ++i)
322-
for (int j = 0; j <= i && j < 16; ++j)
323-
c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod;
324-
vector<vector<ll>> dp(maxValue + 1, vector<ll>(16));
325-
for (int i = 1; i <= maxValue; ++i) dp[i][1] = 1;
333+
for (int i = 0; i < n; ++i) {
334+
for (int j = 0; j <= i && j < 16; ++j) {
335+
if (j == 0) {
336+
c[i][j] = 1;
337+
} else {
338+
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
339+
}
340+
}
341+
}
342+
343+
vector<vector<long long>> f(maxValue + 1, vector<long long>(16));
344+
for (int i = 1; i <= maxValue; ++i) {
345+
f[i][1] = 1;
346+
}
347+
326348
for (int j = 1; j < 15; ++j) {
327349
for (int i = 1; i <= maxValue; ++i) {
328-
int k = 2;
329-
for (; k * i <= maxValue; ++k) dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod;
350+
for (int k = 2; k * i <= maxValue; ++k) {
351+
f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod;
352+
}
330353
}
331354
}
332-
ll ans = 0;
333-
for (int i = 1; i <= maxValue; ++i)
334-
for (int j = 1; j < 16; ++j)
335-
ans = (ans + dp[i][j] * c[n - 1][j - 1]) % mod;
336-
return (int) ans;
355+
356+
long long ans = 0;
357+
for (int i = 1; i <= maxValue; ++i) {
358+
for (int j = 1; j < 16; ++j) {
359+
ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod;
360+
}
361+
}
362+
363+
return ans;
337364
}
338365
};
339366
```
340367

341368
#### Go
342369

343370
```go
344-
func idealArrays(n int, maxValue int) int {
345-
mod := int(1e9) + 7
371+
func idealArrays(n int, maxValue int) (ans int) {
372+
const mod = int(1e9 + 7)
346373
c := make([][]int, n)
347-
for i := range c {
348-
c[i] = make([]int, 16)
349-
}
350374
for i := 0; i < n; i++ {
375+
c[i] = make([]int, 16)
351376
for j := 0; j <= i && j < 16; j++ {
352377
if j == 0 {
353378
c[i][j] = 1
@@ -356,26 +381,66 @@ func idealArrays(n int, maxValue int) int {
356381
}
357382
}
358383
}
359-
dp := make([][]int, maxValue+1)
360-
for i := range dp {
361-
dp[i] = make([]int, 16)
362-
dp[i][1] = 1
384+
385+
f := make([][16]int, maxValue+1)
386+
for i := 1; i <= maxValue; i++ {
387+
f[i][1] = 1
363388
}
364389
for j := 1; j < 15; j++ {
365390
for i := 1; i <= maxValue; i++ {
366-
k := 2
367-
for ; k*i <= maxValue; k++ {
368-
dp[k*i][j+1] = (dp[k*i][j+1] + dp[i][j]) % mod
391+
for k := 2; k*i <= maxValue; k++ {
392+
f[k*i][j+1] = (f[k*i][j+1] + f[i][j]) % mod
369393
}
370394
}
371395
}
372-
ans := 0
396+
373397
for i := 1; i <= maxValue; i++ {
374398
for j := 1; j < 16; j++ {
375-
ans = (ans + dp[i][j]*c[n-1][j-1]) % mod
399+
ans = (ans + f[i][j]*c[n-1][j-1]) % mod
376400
}
377401
}
378-
return ans
402+
return
403+
}
404+
```
405+
406+
#### TypeScript
407+
408+
```ts
409+
function idealArrays(n: number, maxValue: number): number {
410+
const mod = 1e9 + 7;
411+
412+
const c: number[][] = Array.from({ length: n }, () => Array(16).fill(0));
413+
for (let i = 0; i < n; i++) {
414+
for (let j = 0; j <= i && j < 16; j++) {
415+
if (j === 0) {
416+
c[i][j] = 1;
417+
} else {
418+
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
419+
}
420+
}
421+
}
422+
423+
const f: number[][] = Array.from({ length: maxValue + 1 }, () => Array(16).fill(0));
424+
for (let i = 1; i <= maxValue; i++) {
425+
f[i][1] = 1;
426+
}
427+
428+
for (let j = 1; j < 15; j++) {
429+
for (let i = 1; i <= maxValue; i++) {
430+
for (let k = 2; k * i <= maxValue; k++) {
431+
f[k * i][j + 1] = (f[k * i][j + 1] + f[i][j]) % mod;
432+
}
433+
}
434+
}
435+
436+
let ans = 0;
437+
for (let i = 1; i <= maxValue; i++) {
438+
for (let j = 1; j < 16; j++) {
439+
ans = (ans + f[i][j] * c[n - 1][j - 1]) % mod;
440+
}
441+
}
442+
443+
return ans;
379444
}
380445
```
381446

0 commit comments

Comments
 (0)