#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
using ll = long long;
int main() {
int n;
cin >> n;
vector<int> a(n), b(n);
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> b[i];
// dp[mask][diff]:mask状态下净胜场为diff的方案数
// diff范围:-n 到 n,所以偏移n来存储
vector<vector<ll>> dp(1 << n, vector<ll>(2 * n + 1, 0));
dp[0][n] = 1; // 初始:净胜场为0(偏移后为n)
for (int mask = 0; mask < (1 << n); mask++) {
int games = __builtin_popcount(mask); // 已进行比赛数
for (int diff = 0; diff <= 2 * n; diff++) {
if (dp[mask][diff] == 0) continue;
for (int j = 0; j < n; j++) {
if (mask >> j & 1) continue; // B选手j已使用
int next_mask = mask | (1 << j);
int new_diff = diff;
if (a[games] > b[j]) {
new_diff = diff + 1; // A赢,净胜场+1
} else if (a[games] < b[j]) {
new_diff = diff - 1; // B赢,净胜场-1
}
// 平局:净胜场不变
if (new_diff >= 0 && new_diff <= 2 * n) {
dp[next_mask][new_diff] += dp[mask][diff];
}
}
}
}
// 统计结果
ll win = 0, lose = 0, draw = 0;
for (int diff = 0; diff <= 2 * n; diff++) {
if (diff > n) win += dp[(1 << n) - 1][diff]; // 净胜场 > 0
else if (diff < n) lose += dp[(1 << n) - 1][diff]; // 净胜场 < 0
else draw += dp[(1 << n) - 1][diff]; // 净胜场 = 0
}
cout << win << " " << lose << " " << draw << endl;
return 0;
}