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 << ' ';
}
posted @ 2022-05-25 16:51  Bellala  阅读(28)  评论(0)    收藏  举报