Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 674c364

Browse files
feat: add solutions to lc problem: No.3339 (doocs#3698)
No.3339.Find the Number of K-Even Arrays
1 parent 6bea4aa commit 674c364

File tree

19 files changed

+1360
-1
lines changed

19 files changed

+1360
-1
lines changed

‎solution/3300-3399/3339.Find the Number of K-Even Arrays/README.md‎

Lines changed: 529 additions & 0 deletions
Large diffs are not rendered by default.

‎solution/3300-3399/3339.Find the Number of K-Even Arrays/README_EN.md‎

Lines changed: 527 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
int countOfArrays(int n, int m, int k) {
4+
int f[n][k + 1][2];
5+
memset(f, -1, sizeof(f));
6+
const int mod = 1e9 + 7;
7+
int cnt0 = m / 2;
8+
int cnt1 = m - cnt0;
9+
auto dfs = [&](auto&& dfs, int i, int j, int k) -> int {
10+
if (j < 0) {
11+
return 0;
12+
}
13+
if (i >= n) {
14+
return j == 0 ? 1 : 0;
15+
}
16+
if (f[i][j][k] != -1) {
17+
return f[i][j][k];
18+
}
19+
int a = 1LL * cnt1 * dfs(dfs, i + 1, j, 1) % mod;
20+
int b = 1LL * cnt0 * dfs(dfs, i + 1, j - (k & 1 ^ 1), 0) % mod;
21+
return f[i][j][k] = (a + b) % mod;
22+
};
23+
return dfs(dfs, 0, k, 1);
24+
}
25+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
func countOfArrays(n int, m int, k int) int {
2+
f := make([][][2]int, n)
3+
for i := range f {
4+
f[i] = make([][2]int, k+1)
5+
for j := range f[i] {
6+
f[i][j] = [2]int{-1, -1}
7+
}
8+
}
9+
const mod int = 1e9 + 7
10+
cnt0 := m / 2
11+
cnt1 := m - cnt0
12+
var dfs func(int, int, int) int
13+
dfs = func(i, j, k int) int {
14+
if j < 0 {
15+
return 0
16+
}
17+
if i >= n {
18+
if j == 0 {
19+
return 1
20+
}
21+
return 0
22+
}
23+
if f[i][j][k] != -1 {
24+
return f[i][j][k]
25+
}
26+
a := cnt1 * dfs(i+1, j, 1) % mod
27+
b := cnt0 * dfs(i+1, j-(k&1^1), 0) % mod
28+
f[i][j][k] = (a + b) % mod
29+
return f[i][j][k]
30+
}
31+
return dfs(0, k, 1)
32+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
private Integer[][][] f;
3+
private long cnt0, cnt1;
4+
private final int mod = (int) 1e9 + 7;
5+
6+
public int countOfArrays(int n, int m, int k) {
7+
f = new Integer[n][k + 1][2];
8+
cnt0 = m / 2;
9+
cnt1 = m - cnt0;
10+
return dfs(0, k, 1);
11+
}
12+
13+
private int dfs(int i, int j, int k) {
14+
if (j < 0) {
15+
return 0;
16+
}
17+
if (i >= f.length) {
18+
return j == 0 ? 1 : 0;
19+
}
20+
if (f[i][j][k] != null) {
21+
return f[i][j][k];
22+
}
23+
int a = (int) (cnt1 * dfs(i + 1, j, 1) % mod);
24+
int b = (int) (cnt0 * dfs(i + 1, j - (k & 1 ^ 1), 0) % mod);
25+
return f[i][j][k] = (a + b) % mod;
26+
}
27+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def countOfArrays(self, n: int, m: int, k: int) -> int:
3+
@cache
4+
def dfs(i: int, j: int, k: int) -> int:
5+
if j < 0:
6+
return 0
7+
if i >= n:
8+
return int(j == 0)
9+
return (
10+
cnt1 * dfs(i + 1, j, 1) + cnt0 * dfs(i + 1, j - (k & 1 ^ 1), 0)
11+
) % mod
12+
13+
cnt0 = m // 2
14+
cnt1 = m - cnt0
15+
mod = 10**9 + 7
16+
ans = dfs(0, k, 1)
17+
dfs.cache_clear()
18+
return ans
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
function countOfArrays(n: number, m: number, k: number): number {
2+
const f = Array.from({ length: n }, () =>
3+
Array.from({ length: k + 1 }, () => Array(2).fill(-1)),
4+
);
5+
const mod = 1e9 + 7;
6+
const cnt0 = Math.floor(m / 2);
7+
const cnt1 = m - cnt0;
8+
const dfs = (i: number, j: number, k: number): number => {
9+
if (j < 0) {
10+
return 0;
11+
}
12+
if (i >= n) {
13+
return j === 0 ? 1 : 0;
14+
}
15+
if (f[i][j][k] !== -1) {
16+
return f[i][j][k];
17+
}
18+
const a = (cnt1 * dfs(i + 1, j, 1)) % mod;
19+
const b = (cnt0 * dfs(i + 1, j - ((k & 1) ^ 1), 0)) % mod;
20+
return (f[i][j][k] = (a + b) % mod);
21+
};
22+
return dfs(0, k, 1);
23+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
int countOfArrays(int n, int m, int k) {
4+
int f[n + 1][k + 1][2];
5+
memset(f, 0, sizeof(f));
6+
f[0][0][1] = 1;
7+
const int mod = 1e9 + 7;
8+
int cnt0 = m / 2;
9+
int cnt1 = m - cnt0;
10+
for (int i = 1; i <= n; ++i) {
11+
for (int j = 0; j <= k; ++j) {
12+
f[i][j][0] = 1LL * (f[i - 1][j][1] + (j ? f[i - 1][j - 1][0] : 0)) * cnt0 % mod;
13+
f[i][j][1] = 1LL * (f[i - 1][j][0] + f[i - 1][j][1]) * cnt1 % mod;
14+
}
15+
}
16+
return (f[n][k][0] + f[n][k][1]) % mod;
17+
}
18+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func countOfArrays(n int, m int, k int) int {
2+
f := make([][][2]int, n+1)
3+
for i := range f {
4+
f[i] = make([][2]int, k+1)
5+
}
6+
f[0][0][1] = 1
7+
cnt0 := m / 2
8+
cnt1 := m - cnt0
9+
const mod int = 1e9 + 7
10+
for i := 1; i <= n; i++ {
11+
for j := 0; j <= k; j++ {
12+
f[i][j][0] = cnt0 * f[i-1][j][1] % mod
13+
if j > 0 {
14+
f[i][j][0] = (f[i][j][0] + cnt0*f[i-1][j-1][0]%mod) % mod
15+
}
16+
f[i][j][1] = cnt1 * (f[i-1][j][0] + f[i-1][j][1]) % mod
17+
}
18+
}
19+
return (f[n][k][0] + f[n][k][1]) % mod
20+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public int countOfArrays(int n, int m, int k) {
3+
int[][][] f = new int[n + 1][k + 1][2];
4+
int cnt0 = m / 2;
5+
int cnt1 = m - cnt0;
6+
final int mod = (int) 1e9 + 7;
7+
f[0][0][1] = 1;
8+
for (int i = 1; i <= n; ++i) {
9+
for (int j = 0; j <= k; ++j) {
10+
f[i][j][0]
11+
= (int) (1L * cnt0 * (f[i - 1][j][1] + (j > 0 ? f[i - 1][j - 1][0] : 0)) % mod);
12+
f[i][j][1] = (int) (1L * cnt1 * (f[i - 1][j][0] + f[i - 1][j][1]) % mod);
13+
}
14+
}
15+
return (f[n][k][0] + f[n][k][1]) % mod;
16+
}
17+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /