/* -*- coding: utf-8 -*- * * 2152.cc: No.2152 [Cherry Anniversary 2] 19 Petals of Cherry - yukicoder */ #include #include using namespace std; /* constant */ const int N = 19; const int NBITS = 1 << N; const int BN = (N + 1) / 2; const int BBITS = 1 << BN; /* typedef */ typedef long long ll; /* global variables */ int bnums[BBITS], bs[N]; ll dp[NBITS][2]; /* subroutines */ inline int bitnum(int bits) { return bnums[bits >> BN] + bnums[bits & (BBITS - 1)]; } int invcnt(int bits, int i) { int c = 0; for (int j = i + 1, bj = 1 << j; j < N; j++, bj <<= 1) if (bits & bj) c++; return c; } /* main */ int main() { bnums[0] = 0; for (int bits = 1, msb = 1; bits < BBITS; bits++) { if ((msb << 1) <= bits) msb <<= 1; bnums[bits] = bnums[bits ^ msb] + 1; } for (int i = 0; i < N; i++) { int li; scanf("%d", &li); for (int j = 0; j < li; j++) { int aij; scanf("%d", &aij), aij--; bs[i] |= (1 << aij); } //printf("bs[%d] = %d\n", i, bs[i]); } dp[0][0] = 1; for (int bits = 0; bits < NBITS - 1; bits++) { int b = bs[bitnum(bits)]; for (int j = 0; j < 2; j++) if (dp[bits][j] > 0) for (int i = 0, bi = 1; i < N; i++, bi <<= 1) if (! (bits & bi) && (b & bi)) { int invc = invcnt(bits, i); int j1 = (j + invc) & 1; dp[bits | bi][j1] += dp[bits][j]; } } printf("%lld %lld\n", dp[NBITS - 1][0], dp[NBITS - 1][1]); return 0; }