【题目分析】

高斯消元求线性基。

题目本身不难,但是两种维护线性基的方法引起了我的思考。

void gauss(){
    k=n;
    F(i,1,n){
        F(j,i+1,n) if (a[j]>a[i]) swap(a[i],a[j]);
        if (!a[i]) {k=i-1; break;}
        D(j,30,0) if (a[i]>>j & 1){
            b[i]=j;
            F(x,1,n) if (x!=i && a[x]>>j&1) a[x]^=a[i];
            break;
        }
    }
}

  ——高斯消元求线性基

    for (int i=1;i<=n;++i)
        for (int j=31;j>=0;--j)
        if ((a[i]>>j)&1){
            if (!lb[j]) {lb[j]=a[i]; cnt++; break;}
            else a[i]^=lb[j];
        }

  ——动态维护线性基

不会高斯消元解Xor方程组的我,直接使用了第二种方式求解,发现直接WA飞了。

(后来一想,居然过了样例)。

那么他们有什么差别呢。

我对拍了许多组,发现他们求出的线性基的大小是相同的。

但是高斯消元的线性基有一个神奇的特征,是使得该位为1的最小的数。(最小的)

那么有必要去写高斯消元吗?

显然不必要,做一个小操作就好了。

于是改了改动态维护线性基的代码,成了这个样子 ↓

    for (int i=1;i<=n;++i)
        for (int j=31;j>=0;--j)
        if ((a[i]>>j)&1){
            if (!lb[j]) {lb[j]=a[i]; cnt++; break;}
            else a[i]^=lb[j];
        }
    for (int i=31;i>=0;--i)
        if (lb[i])
            for (int j=i-1;j>=0;--j)
                if ((lb[i]>>j)&1) lb[i]^=lb[j];

  ——改版

神奇的AC了。线性基与高斯消元的结果相同。

考虑时间复杂度,都是log*n的,自然没什么差别,但是用哪种就是仁者见仁智者见智了。

实际上高斯消元会快一些(达不到复杂度上限),而动态维护线性基是标准的上限(雾)

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;

#define maxn 100005
#define ll long long
int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

const int mod=10086;
int n,cnt=0,q;
int lb[34],a[maxn];

int power(int a,int b)
{
//  printf ("Pow %d ^ %d is ",a,b);
    int ret=1;
    while (b)
    {
        if (b&1) (ret*=a)%=mod;
        (a*=a)%=mod;
        b>>=1;
    }
//  printf("%d\n",ret);
    return ret;
}

bool cmp(int a,int b)
{
    return a>b;
}

int main()
{
    n=read();
    for (int i=1;i<=n;++i) a[i]=read();
//  sort(a+1,a+n+1);
//  for (int i=1;i<=n;++i) cout<<a[i]<<" "; cout<<endl;
    q=read();
//  cout<<"query : "<<q<<endl;
    for (int i=1;i<=n;++i)
        for (int j=31;j>=0;--j)
        if ((a[i]>>j)&1){
            if (!lb[j]) {lb[j]=a[i]; cnt++; break;}
            else a[i]^=lb[j];
        }
    for (int i=31;i>=0;--i)
        if (lb[i])
            for (int j=i-1;j>=0;--j)
                if ((lb[i]>>j)&1) lb[i]^=lb[j];
//  printf("The Xor Base is %d\n",cnt);
    int rk=0,x=0,tmp=0;
    for (int j=31;j>=0;--j)
    if (lb[j]){
        tmp++;
//      cout<<tmp<<":"<<lb[j]<<endl;
        if ((x^lb[j])>q) continue;
        x^=lb[j];
//      printf("now add %d\n",cnt-tmp);
        rk=(rk+power(2,cnt-tmp))%mod;
    }
    for (int i=1;i<=n-cnt;++i)
        rk=(rk*2)%mod;
    rk++;
    cout<<rk<<endl;
}

  

BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基的更多相关文章

  1. bzoj 2844: albus就是要第一个出场 高斯消元

    LINK 题意:看题目不如看样例解释.给出有n个数的集合,对这些子集中的数求异或,升序统计所有子集得到的数(重复会被计入),询问一个数x,问这个数出现的第一个位置 思路:在这里要求一个所有可能出现的异 ...

  2. BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]

    2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...

  3. 【BZOJ2844】albus就是要第一个出场 高斯消元求线性基

    [BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2 ...

  4. BZOJ 2844: albus就是要第一个出场

    2844: albus就是要第一个出场 Time Limit: 6 Sec  Memory Limit: 128 MBSubmit: 1134  Solved: 481[Submit][Status] ...

  5. BZOJ 2844 albus就是要第一个出场(高斯消元)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2844 题意: 给出一个长度为n的正整数数列A.每次选出A的一个子集进行抑或(空集抑或值为 ...

  6. BZOJ 4004 JLOI2015 装备购买 高斯消元+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4004 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装 ...

  7. bzoj 2844 albus就是要第一个出场 - 线性基

    题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 给定集合$S$,现在将任意$A\subseteq S$中的元素求异或和,然后存入一个数组中(下标从1开始),然后从小到大排 ...

  8. bzoj 2844 albus就是要第一个出场 异或和出现次数 线性基

    题目链接 题意 给定\(n\)个数,将其所有的子集(\(2^n\)个)的异或和按升序排列.给出一个询问\(q\),问\(q\)在该序列中第一次出现位置的下标(下标从\(1\)开始). 题解 结论 记其 ...

  9. BZOJ 2844 高斯消元 线性基

    思路: //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using ...

随机推荐

  1. WPF DataGrid绑定到数据源的方法

    string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["str"].Connect ...

  2. PDFobject插件使用,PDF在线查看插件

    1.引入插件JS <script type="text/javascript" src="PDFobject.js"></script> ...

  3. 使用mosh取代ssh提高n2n网络连接稳定性

    上文实现了远程n2n访问树莓派,但是ssh协议在网络状况不好的时候命令会卡住.这里发现了一个mosh协议,可以增强稳定性,使用后效果明显. 背景:使用n2n之后,在比较差的网络环境下,经常会被time ...

  4. 【转载】Python与ArcGIS Engine的集成

    本文转载自Fransico<Python与ArcGIS Engine的集成>   1 在Python中调用AO类库 1.1  准备工作 本文所使用环境:ArcGIS 10.0.Python ...

  5. nginx 和 IIS 实现负载均衡

    Nginx的作用和优点,这里不必多说,今天主要是nginx负载均衡实验,把做的步骤记录下来,作为一个学习笔记吧,也可以给大家做下参考. 1.Nginx安装 1.下载地址:http://nginx.or ...

  6. 带有“非简单参数”的函数为什么不能包含 "use strict" 指令

    非简单参数就是 ES6 里新加的参数语法,包括:1.默认参数值.2.剩余参数.3.参数解构.本文接下来要讲的就是 ES7 为什么禁止在使用了非简单参数的函数里使用 "use strict&q ...

  7. [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

    [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 试题描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发 ...

  8. PHP 图片处理工具类(添加水印与生成缩略图)

    =================ImageTool.class.php================= <?php class ImageTool { private $imagePath; ...

  9. SAM/BAM文件处理

    当测序得到的fastq文件map到基因组之后,我们通常会得到一个sam或者bam为扩展名的文件.SAM的全称是sequence alignment/map format.而BAM就是SAM的二进制文件 ...

  10. Flask 吐血400错误

    的确地址或者method不匹配,这个容易解决 在后端中取到了form中不存在的元素! 这个很麻烦,特别form里面的信息比较多时!这个需要一一排查.另外取元素时最好用 request.form.get ...