cf1466 F. Euclid's nightmare
题意:
给定两两不同的 \(n\) 个 \(m\) 维向量组成的集合 \(S\),向量的每个分量是 \(0/1\),且每个向量中 \(1\) 的数量不超过 2。定义加法为模2意义下的。
求极大线性空间 \(T\) 使得 \(T\) 的一组基 \(A\) 为 \(S\) 的子集,要求 \(A\) 中向量线性无关且标号集的字典序最小。
输出 \(|T|,|A|\) 以及 \(A\)
思路:
开个并查集。对每个向量,若其中的 \(1\) 在两个位置 \(x,y\),则连边 \(x-y\);若只有一个 \(1\) 在位置 \(x\),则弄个虚拟点 \(0\),连边 \(x-0\)
不能有环。产生环了就跳过。
那么 \(|T|=2^{|A|}\)
int n, m, p[N]; vector<int> ans;
void sol() {
cin >> n >> m;
for(int i = 0; i <= m; i++) p[i] = i;
for(int i = 1; i <= n; i++) {
int k, x, y=0; cin >> k >> x;
if(k == 2) cin >> y;
x = get(x), y = get(y);
if(x != y) ans.pb(i), p[x] = y;
}
ll T = 1; for(int i = 0; i < ans.size(); i++) (T *= 2) %= mod;
cout << T << ' ' << ans.size() << endl;
for(int i : ans) cout << i << ' ';
}

浙公网安备 33010602011771号