int main() { while (scanf("%d%d", &n, &m) != EOF) { memset(g, 0, sizeof (g)); for (int i = 0; i < n; i++) { int mm, x; scanf("%d", &mm); for (int j = 0; j < mm; j++) { scanf("%d", &x); g[i][x] = 1; } } printf("%d\n", max_match()); } return 0; }
int main(){ while(scanf("%d", &n)!=EOF){ int x, y, m; memset(map, 0, sizeof(map)); for(int i=0;i<n;i++){ scanf("%d:", &x); getchar(); scanf("(%d)", &m); for(int j=0;j<m;j++){ scanf("%d", &y); map[x][y]=1; } } printf("%d\n", n-max_match()/2); } return 0; }
int main() { get_prime(); long long l, r; while (scanf("%lld%lld", &l, &r) && l + r > 0) { for (int i = 0; i < N; ++ i) { neighbors[i].clear(); } std::set<long long> set; for (long long i = l; i <= r; ++ i) { long long x = i; for (int j = 0; (long long)primes[j] * primes[j] <= x; ++ j) { if (x % primes[j] == 0) { set.insert(primes[j]); } while (x % primes[j] == 0) { x /= primes[j]; } } if (x > 1) { set.insert(x); } } size = 0; for (std::set<long long>::iterator iter = set.begin(); iter != set.end(); iter ++, size ++) { long long x = *iter; map[size] = x; for (long long i = l; i <= r; ++ i) { if (i % x == 0) { neighbors[i - l].push_back(size); // printf("%d %d\n", i, x); } } } n = r - l + 1; memset(invalid, 0, sizeof(invalid)); memset(answer, 0, sizeof(answer)); for (int i = 0; i < n; ++ i) { for (int j = 0; j < (int)neighbors[i].size(); ++ j) { int x = neighbors[i][j]; if (invalid[x]) { continue; } invalid[x] = true; if (!max_match(i + 1)) { invalid[x] = false; } else { answer[i] = map[x]; break; } } if (answer[i] == 0) { for (int j = 0; j < neighbors[i].size(); ++ j) { int x = neighbors[i][j]; if (!invalid[x]) { answer[i] = map[x]; invalid[x] = true; break; } } } } for (int i = 0; i < n; ++ i) { printf("%lld%c", answer[i], i == n - 1 ? '\n' : ' '); } } return 0; }