import java.util.Scanner;
class EvenOddDP {
public static void main
(String[] args
) {
Scanner scanner
= new Scanner
(System.
in);
int n = scanner.nextInt();
long[] a = new long[n + 1];
long[] b = new long[n + 1];
// Input array A
for (int i = 1; i <= n; i++) {
a[i] = scanner.nextLong();
}
// Input array B
for (int i = 1; i <= n; i++) {
b[i] = scanner.nextLong();
}
long[] result = computeEvenOddCounts(n, a, b);
System.
out.
println("Total Even: " + result
[0]); System.
out.
println("Total Odd: " + result
[1]);
scanner.close();
}
public static long[] computeEvenOddCounts(
int n, long[] a, long[] b) {
// dpA[i][0] = journeys ending at A[i] with EVEN sum
// dpA[i][1] = journeys ending at A[i] with ODD sum
//
// dpB[i][0] = journeys ending at B[i] with EVEN sum
// dpB[i][1] = journeys ending at B[i] with ODD sum
long[][] dpA = new long[n + 1][2];
long[][] dpB = new long[n + 1][2];
// ---------------- BASE CASE ----------------
if (a[1] % 2 == 0)
dpA[1][0] = 1;
else
dpA[1][1] = 1;
if (b[1] % 2 == 0)
dpB[1][0] = 1;
else
dpB[1][1] = 1;
// ---------------- TRANSITIONS ----------------
for (int i = 2; i <= n; i++) {
// To reach A[i]:
// A[i-1] -> A[i]
// B[i-1] -> A[i]
if (a[i] % 2 == 0) {
// Adding even keeps parity same
dpA[i][0] =
dpA[i - 1][0] + dpB[i - 1][0];
dpA[i][1] =
dpA[i - 1][1] + dpB[i - 1][1];
} else {
// Adding odd flips parity
dpA[i][0] =
dpA[i - 1][1] + dpB[i - 1][1];
dpA[i][1] =
dpA[i - 1][0] + dpB[i - 1][0];
}
// To reach B[i]:
// A[i-1] -> B[i]
// B[i-1] -> B[i]
if (b[i] % 2 == 0) {
// Adding even keeps parity same
dpB[i][0] =
dpA[i - 1][0] + dpB[i - 1][0];
dpB[i][1] =
dpA[i - 1][1] + dpB[i - 1][1];
} else {
// Adding odd flips parity
dpB[i][0] =
dpA[i - 1][1] + dpB[i - 1][1];
dpB[i][1] =
dpA[i - 1][0] + dpB[i - 1][0];
}
}
// ---------------- FINAL ANSWER ----------------
// We can end at either A[n] or B[n]
long even =
dpA[n][0] + dpB[n][0];
long odd =
dpA[n][1] + dpB[n][1];
return new long[]{even, odd};
}
}