【题目分析】

高斯消元求线性基。

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

  1. void gauss(){
  2. k=n;
  3. F(i,1,n){
  4. F(j,i+1,n) if (a[j]>a[i]) swap(a[i],a[j]);
  5. if (!a[i]) {k=i-1; break;}
  6. D(j,30,0) if (a[i]>>j & 1){
  7. b[i]=j;
  8. F(x,1,n) if (x!=i && a[x]>>j&1) a[x]^=a[i];
  9. break;
  10. }
  11. }
  12. }

  ——高斯消元求线性基

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

  ——动态维护线性基

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

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

那么他们有什么差别呢。

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

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

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

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

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

  1. for (int i=1;i<=n;++i)
  2. for (int j=31;j>=0;--j)
  3. if ((a[i]>>j)&1){
  4. if (!lb[j]) {lb[j]=a[i]; cnt++; break;}
  5. else a[i]^=lb[j];
  6. }
  7. for (int i=31;i>=0;--i)
  8. if (lb[i])
  9. for (int j=i-1;j>=0;--j)
  10. if ((lb[i]>>j)&1) lb[i]^=lb[j];

  ——改版

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

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

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

【代码】

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cmath>
  5.  
  6. #include <set>
  7. #include <map>
  8. #include <string>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <iostream>
  12. #include <queue>
  13. using namespace std;
  14.  
  15. #define maxn 100005
  16. #define ll long long
  17. int read()
  18. {
  19. int x=0,f=1; char ch=getchar();
  20. while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
  21. while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
  22. return x*f;
  23. }
  24.  
  25. const int mod=10086;
  26. int n,cnt=0,q;
  27. int lb[34],a[maxn];
  28.  
  29. int power(int a,int b)
  30. {
  31. // printf ("Pow %d ^ %d is ",a,b);
  32. int ret=1;
  33. while (b)
  34. {
  35. if (b&1) (ret*=a)%=mod;
  36. (a*=a)%=mod;
  37. b>>=1;
  38. }
  39. // printf("%d\n",ret);
  40. return ret;
  41. }
  42.  
  43. bool cmp(int a,int b)
  44. {
  45. return a>b;
  46. }
  47.  
  48. int main()
  49. {
  50. n=read();
  51. for (int i=1;i<=n;++i) a[i]=read();
  52. // sort(a+1,a+n+1);
  53. // for (int i=1;i<=n;++i) cout<<a[i]<<" "; cout<<endl;
  54. q=read();
  55. // cout<<"query : "<<q<<endl;
  56. for (int i=1;i<=n;++i)
  57. for (int j=31;j>=0;--j)
  58. if ((a[i]>>j)&1){
  59. if (!lb[j]) {lb[j]=a[i]; cnt++; break;}
  60. else a[i]^=lb[j];
  61. }
  62. for (int i=31;i>=0;--i)
  63. if (lb[i])
  64. for (int j=i-1;j>=0;--j)
  65. if ((lb[i]>>j)&1) lb[i]^=lb[j];
  66. // printf("The Xor Base is %d\n",cnt);
  67. int rk=0,x=0,tmp=0;
  68. for (int j=31;j>=0;--j)
  69. if (lb[j]){
  70. tmp++;
  71. // cout<<tmp<<":"<<lb[j]<<endl;
  72. if ((x^lb[j])>q) continue;
  73. x^=lb[j];
  74. // printf("now add %d\n",cnt-tmp);
  75. rk=(rk+power(2,cnt-tmp))%mod;
  76. }
  77. for (int i=1;i<=n-cnt;++i)
  78. rk=(rk*2)%mod;
  79. rk++;
  80. cout<<rk<<endl;
  81. }

  

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. DropDownList控件

    1.DropDownList控件 <asp:DropDownList runat="server" ID="DropDownList1" AutoPost ...

  2. WEKA使用

    参考 http://bbs.middleware123.com/thread-24052-1-1.html  使用Weka进行数据挖掘 http://quweiprotoss.blog.163.com ...

  3. jmeter 运行多个sql

    1.关键就是"allowMultiQueries=true" database url:jdbc:mysql://127.0.0.1:3306/api?useUnicode=tru ...

  4. 浅谈系统架构<一>

    前言:博主刚刚从事于Web后端开发与学习不久,开发项目经验也是有限的.不过今天依旧将一些个人的想法记录下来,我的构想或许不太正确,还望各位大牛能给我多多建议. 首先:我们从编程开始讲起 博主是偏向于后 ...

  5. 11月10日下午 ajax做显示信息以后用ajax、Bootstrp做弹窗显示信息详情

    1.用ajax做弹窗显示信息详情 nation.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  6. thinkphp上传

    上传代码 // 缩略图上传 $upload = new \Think\Upload();// 实例化上传类 $upload->maxSize = ;// 设置附件上传大小 $upload-> ...

  7. yii2 伪静态配置

    原文地址: http://gblz.net/2015/242.html https://segmentfault.com/q/1010000003804408

  8. Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended

    问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.Extended对Mysql的支持不是很完 ...

  9. php 去掉字符串的最后一个字符

    原字符串1,2,3,4,5,6, 去掉最后一个字符",",最终结果为1,2,3,4,5,6 代码如下: $str = "1,2,3,4,5,6,"; $news ...

  10. js自动闭合html标签,自动补全html标记

    假如我有一个DIV,如果没有闭合后面的样式都会乱了,这样的代码可能会影响后面的样式,我希望用js去自动闭合这种没有闭合的标签: 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...