#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define stop exit(0) #define nc -1 #define eps 1e-10 #define inf 1000000000 #define mod 1000000007 #define mp make_pair #define fill(array,value) memset(array,value,sizeof(array)) #define f(i,beg,end) for(int i=beg; i<=end; i++) #define F(i,beg,end) for(int i=beg; i>=end; i--) #define Max(a,b) ( (a>b)?a:b ) #define Min(a,b) ( (a days[16]; int numDays[16]; void init() { cin >> n; f(i,1,n) { cin >> numDays[i]; days[i].resize(numDays[i]); f(j,0,numDays[i]-1) cin >> days[i][j]; } } int dp[16][(1 << 11)]; inline bool ok(int food, int day) { if (days[food].empty()) return true; f(i,0,days[food].size()-1) { if (days[food][i] == day) { return false; } } return true; } int ans(int day, int mask) { if (dp[day][mask] != -1) { return dp[day][mask]; } int ret = 0; f(i,0,n-1) { if (mask & (1 << i)) { // (i+1)-th food is available if (ok(i+1,day)) { ret += ans(day-1, mask-(1<> numberOfTests; f(i,1,numberOfTests) { init(); solve(); } return 0; }