BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基
【题目分析】
高斯消元求线性基。
题目本身不难,但是两种维护线性基的方法引起了我的思考。
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就是要第一个出场 ——高斯消元 线性基的更多相关文章
- bzoj 2844: albus就是要第一个出场 高斯消元
LINK 题意:看题目不如看样例解释.给出有n个数的集合,对这些子集中的数求异或,升序统计所有子集得到的数(重复会被计入),询问一个数x,问这个数出现的第一个位置 思路:在这里要求一个所有可能出现的异 ...
- BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]
2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...
- 【BZOJ2844】albus就是要第一个出场 高斯消元求线性基
[BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2 ...
- BZOJ 2844: albus就是要第一个出场
2844: albus就是要第一个出场 Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 1134 Solved: 481[Submit][Status] ...
- BZOJ 2844 albus就是要第一个出场(高斯消元)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2844 题意: 给出一个长度为n的正整数数列A.每次选出A的一个子集进行抑或(空集抑或值为 ...
- BZOJ 4004 JLOI2015 装备购买 高斯消元+线性基
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4004 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装 ...
- bzoj 2844 albus就是要第一个出场 - 线性基
题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 给定集合$S$,现在将任意$A\subseteq S$中的元素求异或和,然后存入一个数组中(下标从1开始),然后从小到大排 ...
- bzoj 2844 albus就是要第一个出场 异或和出现次数 线性基
题目链接 题意 给定\(n\)个数,将其所有的子集(\(2^n\)个)的异或和按升序排列.给出一个询问\(q\),问\(q\)在该序列中第一次出现位置的下标(下标从\(1\)开始). 题解 结论 记其 ...
- BZOJ 2844 高斯消元 线性基
思路: //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using ...
随机推荐
- 关于背景图相对父容器垂直居中问题 —— vertical-align 和 line-height 之间的区别
html css <div class="register-wrapper"> <div class="register"> &l ...
- Excel 函数VLOOKUP初学者使用指南
1.基础说明 =VLOOKUP(lookup_value,tabble_array,col_index_num,(range_lookup)) lookup_value:用什么查找 tabble_ar ...
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- vue2.0学习(一)
1.解决双花括号在初始化时的闪烁,两种方式,一种是<div v-text="name"></div>,将用v-text指令来显示,类似于angular的ng ...
- 【Alpha版本】冲刺-Day5
队伍:606notconnected 会议时间:11月13日 会议总结 张斯巍(433) 今天安排:完成昨天没完成的,设置界面设计 完成度:85% 明天计划:学习UI设计 遇到的问题:无 感想:一定要 ...
- angular-ui-bootstrap-modal必须要说的几个点(转)
angular-ui-bootstrap-modal必须要说的几个点 摘要: 基于angular来实现的一个bootstrap模态框,有些不得不说的地方 项目中以前就经常用到模态框,但是一直没有时间来 ...
- liunx学习(一):linux下目录操作大全
Linux C函数之文件及目录函数(全):http://blog.sina.com.cn/s/blog_695e489c01013ldd.html linux目录操作发:http://www.cnbl ...
- re.search 和 re.match
相同点: 都返回找到的第一个匹配对象 >>> import re >>> m = re.search('(\w+) (\w+)', 'aaa bbb ccc ddd ...
- 十二. 一步步破解JEB 2.0demo版二
编写脚本批量还愿JEB 加密字符串 解密完后效果如下: 脚本源码: https://github.com/bingghost/JebPlugins 思路: 下面的该封装的基本都封装了,过程如下: 1. ...
- 音频指纹(Philips)
参考<A Highly Robust Audio Fingerprinting System> Philips 音频指纹提取流程: 仿真效果: 第一个图为歌曲1的第一个指纹. 第二个图为歌 ...