zoukankan      html  css  js  c++  java
  • 线性基学习

    首先板子

    const int L = 63;
    ll d[L];
    bool add(ll x)
    {
        for(int i = L - 1; i >= 0; i--)
            if(x & 1ll << i)
            {
                if(d[i] == -1)
                {
                    d[i] = x;
                    return true;
                }
                x ^= d[i];
            }
        return false;
    }

    线性基的规模就是你二进制的位数

    如果要判断两个线性基的值域相同 只需要依次插入值就好了 详见agc045 A题解  链接:https://www.cnblogs.com/acmLLF/p/13636575.html

    线性基的第L个元素,最高位一定是第L位,且为1

    所以要是取最大值,依次从大到小取max异或就行了,因为后面不会覆盖前面的最高位,但有可能覆盖低位,所以取个max就行了

    最小值直接取线性基中最小值  特殊处理0,注意 因为线性基的值域 一定不包含0

    查询是否存在于此基的值域中,取此数二进制下每一位,依次从大到小异或,若为1,则异或,若0,则下一位继续 

    若异或的最终答案是0,那么存在

  • 相关阅读:
    SPI 1
    运算符
    移位运算
    Comet OJ
    图论 最短路 基础
    CF div3 582 C. Book Reading
    Comet OJ
    VScode 标记“&&”不是此版本中的有效语句分隔符。
    Educational Codeforces Round 63 (Rated for Div. 2)
    1223:An Easy Problem
  • 原文地址:https://www.cnblogs.com/acmLLF/p/13639287.html
Copyright © 2011-2022 走看看