Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
529 changes: 529 additions & 0 deletions solution/3300-3399/3339.Find the Number of K-Even Arrays/README.md

Large diffs are not rendered by default.

527 changes: 527 additions & 0 deletions solution/3300-3399/3339.Find the Number of K-Even Arrays/README_EN.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
class Solution {
public:
int countOfArrays(int n, int m, int k) {
int f[n][k + 1][2];
memset(f, -1, sizeof(f));
const int mod = 1e9 + 7;
int cnt0 = m / 2;
int cnt1 = m - cnt0;
auto dfs = [&](auto&& dfs, int i, int j, int k) -> int {
if (j < 0) {
return 0;
}
if (i >= n) {
return j == 0 ? 1 : 0;
}
if (f[i][j][k] != -1) {
return f[i][j][k];
}
int a = 1LL * cnt1 * dfs(dfs, i + 1, j, 1) % mod;
int b = 1LL * cnt0 * dfs(dfs, i + 1, j - (k & 1 ^ 1), 0) % mod;
return f[i][j][k] = (a + b) % mod;
};
return dfs(dfs, 0, k, 1);
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
func countOfArrays(n int, m int, k int) int {
f := make([][][2]int, n)
for i := range f {
f[i] = make([][2]int, k+1)
for j := range f[i] {
f[i][j] = [2]int{-1, -1}
}
}
const mod int = 1e9 + 7
cnt0 := m / 2
cnt1 := m - cnt0
var dfs func(int, int, int) int
dfs = func(i, j, k int) int {
if j < 0 {
return 0
}
if i >= n {
if j == 0 {
return 1
}
return 0
}
if f[i][j][k] != -1 {
return f[i][j][k]
}
a := cnt1 * dfs(i+1, j, 1) % mod
b := cnt0 * dfs(i+1, j-(k&1^1), 0) % mod
f[i][j][k] = (a + b) % mod
return f[i][j][k]
}
return dfs(0, k, 1)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
class Solution {
private Integer[][][] f;
private long cnt0, cnt1;
private final int mod = (int) 1e9 + 7;

public int countOfArrays(int n, int m, int k) {
f = new Integer[n][k + 1][2];
cnt0 = m / 2;
cnt1 = m - cnt0;
return dfs(0, k, 1);
}

private int dfs(int i, int j, int k) {
if (j < 0) {
return 0;
}
if (i >= f.length) {
return j == 0 ? 1 : 0;
}
if (f[i][j][k] != null) {
return f[i][j][k];
}
int a = (int) (cnt1 * dfs(i + 1, j, 1) % mod);
int b = (int) (cnt0 * dfs(i + 1, j - (k & 1 ^ 1), 0) % mod);
return f[i][j][k] = (a + b) % mod;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class Solution:
def countOfArrays(self, n: int, m: int, k: int) -> int:
@cache
def dfs(i: int, j: int, k: int) -> int:
if j < 0:
return 0
if i >= n:
return int(j == 0)
return (
cnt1 * dfs(i + 1, j, 1) + cnt0 * dfs(i + 1, j - (k & 1 ^ 1), 0)
) % mod

cnt0 = m // 2
cnt1 = m - cnt0
mod = 10**9 + 7
ans = dfs(0, k, 1)
dfs.cache_clear()
return ans
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
function countOfArrays(n: number, m: number, k: number): number {
const f = Array.from({ length: n }, () =>
Array.from({ length: k + 1 }, () => Array(2).fill(-1)),
);
const mod = 1e9 + 7;
const cnt0 = Math.floor(m / 2);
const cnt1 = m - cnt0;
const dfs = (i: number, j: number, k: number): number => {
if (j < 0) {
return 0;
}
if (i >= n) {
return j === 0 ? 1 : 0;
}
if (f[i][j][k] !== -1) {
return f[i][j][k];
}
const a = (cnt1 * dfs(i + 1, j, 1)) % mod;
const b = (cnt0 * dfs(i + 1, j - ((k & 1) ^ 1), 0)) % mod;
return (f[i][j][k] = (a + b) % mod);
};
return dfs(0, k, 1);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class Solution {
public:
int countOfArrays(int n, int m, int k) {
int f[n + 1][k + 1][2];
memset(f, 0, sizeof(f));
f[0][0][1] = 1;
const int mod = 1e9 + 7;
int cnt0 = m / 2;
int cnt1 = m - cnt0;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= k; ++j) {
f[i][j][0] = 1LL * (f[i - 1][j][1] + (j ? f[i - 1][j - 1][0] : 0)) * cnt0 % mod;
f[i][j][1] = 1LL * (f[i - 1][j][0] + f[i - 1][j][1]) * cnt1 % mod;
}
}
return (f[n][k][0] + f[n][k][1]) % mod;
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
func countOfArrays(n int, m int, k int) int {
f := make([][][2]int, n+1)
for i := range f {
f[i] = make([][2]int, k+1)
}
f[0][0][1] = 1
cnt0 := m / 2
cnt1 := m - cnt0
const mod int = 1e9 + 7
for i := 1; i <= n; i++ {
for j := 0; j <= k; j++ {
f[i][j][0] = cnt0 * f[i-1][j][1] % mod
if j > 0 {
f[i][j][0] = (f[i][j][0] + cnt0*f[i-1][j-1][0]%mod) % mod
}
f[i][j][1] = cnt1 * (f[i-1][j][0] + f[i-1][j][1]) % mod
}
}
return (f[n][k][0] + f[n][k][1]) % mod
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class Solution {
public int countOfArrays(int n, int m, int k) {
int[][][] f = new int[n + 1][k + 1][2];
int cnt0 = m / 2;
int cnt1 = m - cnt0;
final int mod = (int) 1e9 + 7;
f[0][0][1] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= k; ++j) {
f[i][j][0]
= (int) (1L * cnt0 * (f[i - 1][j][1] + (j > 0 ? f[i - 1][j - 1][0] : 0)) % mod);
f[i][j][1] = (int) (1L * cnt1 * (f[i - 1][j][0] + f[i - 1][j][1]) % mod);
}
}
return (f[n][k][0] + f[n][k][1]) % mod;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class Solution:
def countOfArrays(self, n: int, m: int, k: int) -> int:
f = [[[0] * 2 for _ in range(k + 1)] for _ in range(n + 1)]
cnt0 = m // 2
cnt1 = m - cnt0
mod = 10**9 + 7
f[0][0][1] = 1
for i in range(1, n + 1):
for j in range(k + 1):
f[i][j][0] = (
(f[i - 1][j][1] + (f[i - 1][j - 1][0] if j else 0)) * cnt0 % mod
)
f[i][j][1] = (f[i - 1][j][0] + f[i - 1][j][1]) * cnt1 % mod
return sum(f[n][k]) % mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
function countOfArrays(n: number, m: number, k: number): number {
const f: number[][][] = Array.from({ length: n + 1 }, () =>
Array.from({ length: k + 1 }, () => Array(2).fill(0)),
);
f[0][0][1] = 1;
const mod = 1e9 + 7;
const cnt0 = Math.floor(m / 2);
const cnt1 = m - cnt0;
for (let i = 1; i <= n; ++i) {
for (let j = 0; j <= k; ++j) {
f[i][j][0] = (cnt0 * (f[i - 1][j][1] + (j ? f[i - 1][j - 1][0] : 0))) % mod;
f[i][j][1] = (cnt1 * (f[i - 1][j][0] + f[i - 1][j][1])) % mod;
}
}
return (f[n][k][0] + f[n][k][1]) % mod;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class Solution {
public:
int countOfArrays(int n, int m, int k) {
vector<vector<int>> f(k + 1, vector<int>(2));
int cnt0 = m / 2;
int cnt1 = m - cnt0;
const int mod = 1e9 + 7;
f[0][1] = 1;

for (int i = 0; i < n; ++i) {
vector<vector<int>> g(k + 1, vector<int>(2));
for (int j = 0; j <= k; ++j) {
g[j][0] = (1LL * cnt0 * (f[j][1] + (j > 0 ? f[j - 1][0] : 0)) % mod) % mod;
g[j][1] = (1LL * cnt1 * (f[j][0] + f[j][1]) % mod) % mod;
}
f = g;
}
return (f[k][0] + f[k][1]) % mod;
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
func countOfArrays(n int, m int, k int) int {
const mod = 1e9 + 7
cnt0 := m / 2
cnt1 := m - cnt0
f := make([][2]int, k+1)
f[0][1] = 1

for i := 0; i < n; i++ {
g := make([][2]int, k+1)
for j := 0; j <= k; j++ {
g[j][0] = (cnt0 * (f[j][1] + func() int {
if j > 0 {
return f[j-1][0]
}
return 0
}()) % mod) % mod
g[j][1] = (cnt1 * (f[j][0] + f[j][1]) % mod) % mod
}
f = g
}

return (f[k][0] + f[k][1]) % mod
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class Solution {
public int countOfArrays(int n, int m, int k) {
int[][] f = new int[k + 1][2];
int cnt0 = m / 2;
int cnt1 = m - cnt0;
final int mod = (int) 1e9 + 7;
f[0][1] = 1;
for (int i = 0; i < n; ++i) {
int[][] g = new int[k + 1][2];
for (int j = 0; j <= k; ++j) {
g[j][0] = (int) (1L * cnt0 * (f[j][1] + (j > 0 ? f[j - 1][0] : 0)) % mod);
g[j][1] = (int) (1L * cnt1 * (f[j][0] + f[j][1]) % mod);
}
f = g;
}
return (f[k][0] + f[k][1]) % mod;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class Solution:
def countOfArrays(self, n: int, m: int, k: int) -> int:
f = [[0] * 2 for _ in range(k + 1)]
cnt0 = m // 2
cnt1 = m - cnt0
mod = 10**9 + 7
f[0][1] = 1
for _ in range(n):
g = [[0] * 2 for _ in range(k + 1)]
for j in range(k + 1):
g[j][0] = (f[j][1] + (f[j - 1][0] if j else 0)) * cnt0 % mod
g[j][1] = (f[j][0] + f[j][1]) * cnt1 % mod
f = g
return sum(f[k]) % mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
function countOfArrays(n: number, m: number, k: number): number {
const mod = 1e9 + 7;
const cnt0 = Math.floor(m / 2);
const cnt1 = m - cnt0;
const f: number[][] = Array.from({ length: k + 1 }, () => [0, 0]);
f[0][1] = 1;
for (let i = 0; i < n; i++) {
const g: number[][] = Array.from({ length: k + 1 }, () => [0, 0]);
for (let j = 0; j <= k; j++) {
g[j][0] = ((cnt0 * (f[j][1] + (j > 0 ? f[j - 1][0] : 0))) % mod) % mod;
g[j][1] = ((cnt1 * (f[j][0] + f[j][1])) % mod) % mod;
}
f.splice(0, f.length, ...g);
}
return (f[k][0] + f[k][1]) % mod;
}
3 changes: 2 additions & 1 deletion solution/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3349,6 +3349,7 @@
| 3336 | [最大公约数相等的子序列数量](/solution/3300-3399/3336.Find%20the%20Number%20of%20Subsequences%20With%20Equal%20GCD/README.md) | `数组`,`数学`,`动态规划`,`数论` | 困难 | 第 421 场周赛 |
| 3337 | [字符串转换后的长度 II](/solution/3300-3399/3337.Total%20Characters%20in%20String%20After%20Transformations%20II/README.md) | `哈希表`,`数学`,`字符串`,`动态规划`,`计数` | 困难 | 第 421 场周赛 |
| 3338 | [第二高的薪水 II](/solution/3300-3399/3338.Second%20Highest%20Salary%20II/README.md) | `数据库` | 中等 | 🔒 |
| 3339 | [查找 K 偶数数组的数量](/solution/3300-3399/3339.Find%20the%20Number%20of%20K-Even%20Arrays/README.md) | `动态规划` | 中等 | 🔒 |

## 版权

Expand All @@ -3359,4 +3360,4 @@
欢迎各位小伙伴们添加 @yanglbme 的个人微信(微信号:YLB0109),备注 「**leetcode**」。后续我们会创建算法、技术相关的交流群,大家一起交流学习,分享经验,共同进步。

| <img src="https://cdn-doocs.oss-cn-shenzhen.aliyuncs.com/gh/doocs/images/qrcode-for-yanglbme.png" width="260px" align="left"/> |
| ------------------------------------------------------------------------------------------------------------------------------ |
| ------------------------------------------------------------------------------------------------------------------------------ |
1 change: 1 addition & 0 deletions solution/README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -3347,6 +3347,7 @@ Press <kbd>Control</kbd> + <kbd>F</kbd>(or <kbd>Command</kbd> + <kbd>F</kbd> on
| 3336 | [Find the Number of Subsequences With Equal GCD](/solution/3300-3399/3336.Find%20the%20Number%20of%20Subsequences%20With%20Equal%20GCD/README_EN.md) | `Array`,`Math`,`Dynamic Programming`,`Number Theory` | Hard | Weekly Contest 421 |
| 3337 | [Total Characters in String After Transformations II](/solution/3300-3399/3337.Total%20Characters%20in%20String%20After%20Transformations%20II/README_EN.md) | `Hash Table`,`Math`,`String`,`Dynamic Programming`,`Counting` | Hard | Weekly Contest 421 |
| 3338 | [Second Highest Salary II](/solution/3300-3399/3338.Second%20Highest%20Salary%20II/README_EN.md) | `Database` | Medium | 🔒 |
| 3339 | [Find the Number of K-Even Arrays](/solution/3300-3399/3339.Find%20the%20Number%20of%20K-Even%20Arrays/README_EN.md) | `Dynamic Programming` | Medium | 🔒 |

## Copyright

Expand Down
Loading