The key is to count arrays where exactly k pairs of adjacent elements satisfy (arr[i] * arr[i+1]) - arr[i] - arr[i+1] is even. This expression is even if and only if arr[i] and arr[i+1] have the same parity (both even or both odd). We can use dynamic programming to count the number of arrays with exactly k such adjacent pairs.
classSolution {
funnumberOfKEvenArrays(n: Int, m: Int, k: Int): Int {
val MOD = 1_000_000_007
val odd = (m + 1) / 2val even = m / 2val dp = Array(n + 1) { Array(k + 1) { IntArray(2) } }
dp[1][0][0] = even
dp[1][0][1] = odd
for (i in2..n) {
for (j in0..k) {
for (p in0..1) {
val cnt = if (p ==0) even else odd
for (q in0..1) {
val add = if (p == q) 1else0if (j >= add)
dp[i][j][p] = (dp[i][j][p] + dp[i-1][j-add][q].toLong() * cnt % MOD).toInt()
}
}
}
}
return (dp[n][k][0] + dp[n][k][1]) % MOD
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution:
defnumberOfKEvenArrays(self, n: int, m: int, k: int) -> int:
MOD =10**9+7 odd = (m +1) //2 even = m //2 dp = [[[0, 0] for _ in range(k +1)] for _ in range(n +1)]
dp[1][0][0] = even
dp[1][0][1] = odd
for i in range(2, n +1):
for j in range(k +1):
for p in range(2):
cnt = even if p ==0else odd
for q in range(2):
add =1if p == q else0if j >= add:
dp[i][j][p] = (dp[i][j][p] + dp[i-1][j-add][q] * cnt) % MOD
return (dp[n][k][0] + dp[n][k][1]) % MOD
impl Solution {
pubfnnumber_of_k_even_arrays(n: i32, m: i32, k: i32) -> i32 {
let n = n asusize;
let m = m asusize;
let k = k asusize;
let odd = (m +1) /2;
let even = m /2;
letmut dp =vec![vec![vec![0i64; 2]; k +1]; n +1];
dp[1][0][0] = even asi64;
dp[1][0][1] = odd asi64;
letMOD=1_000_000_007i64;
for i in2..=n {
for j in0..=k {
for p in0..2 {
let cnt =if p ==0 { even } else { odd } asi64;
for q in0..2 {
let add =if p == q { 1 } else { 0 };
if j >= add {
dp[i][j][p] = (dp[i][j][p] + dp[i-1][j-add][q] * cnt) %MOD;
}
}
}
}
}
((dp[n][k][0] + dp[n][k][1]) %MOD) asi32 }
}