hdu 3949 (线性基学习)
来源:互联网 发布:840dsl调试软件 编辑:程序博客网 时间:2024/06/06 15:47
题意:给N个数, 求异或和第k大的数
线性基:高斯消元构造对角矩阵,具体理论证明看其他详细介绍
把k二进制拆分,第i位上有1,就把第i个线性基异或进来。
原因:
因为线性基是一堆高位上的1(或许有一些位动不了),然后把这样每一位可以填0/1,跟二进制差不多,第i位为1时取当前行的矩阵值,就能得到第k大的值了
注意:输出lld会wa,输出I64u
#include <iostream>#include <string.h>using namespace std;#define ll unsigned long long#define M 63int n;ll dat[10005],flag,tot;ll mt[70];void gauss(){ memset(mt,0,sizeof(mt)); ll i,j,k,r; flag=0; for(i=1;i<=n;i++) { for(j=M;~j;j--) { if( (dat[i]>>j)&1 ) if( !mt[j] ) { mt[j]=dat[i]; for(k=0;k<=M;k++) for(r=k+1;r<=M;r++) if( (mt[r]>>k)&1 ) mt[r]^=mt[k]; break; } else dat[i]^=mt[j]; } if( dat[i]==0) flag=1; }}int main(){ int T,t,m; ll i,q; scanf("%d",&T); for(t=1;t<=T;t++) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%I64u",&dat[i]); gauss(); for(i=0,tot=0;i<=M;i++) if(mt[i]) mt[tot++]=mt[i]; printf("Case #%d:\n",t); scanf("%d",&m); while(m--) { scanf("%I64u",&q); ll ans=0; q-=flag; if(q==0) printf("0\n"); else if( q>>tot ) printf("-1\n"); else { for(i=0;i<tot;i++) { if((q>>i)&1) ans^=mt[i]; } printf("%I64u\n",ans); } } } return 0;}
阅读全文
0 0
- hdu 3949 (线性基学习)
- hdu 3949 XOR (高斯消元求线性基)
- 【HDU 3949】 XOR|线性基
- [HDU 3949]XOR:线性基
- Hdu 3949 XOR 线性基
- HDU-3949 XOR 线性基
- HDU 3949 XOR (高斯消元求线性基)
- HDU 3949 XOR [线性基|高斯消元]【数学】
- HDU 3949 异或线性基
- [高斯消元 线性基 二进制拆分] HDU 3949 XOR
- [学习笔记]线性基
- 线性基的学习
- 线性基学习笔记
- 线性基学习笔记
- 线性基学习笔记
- 线性基学习笔记
- 线性基学习笔记
- hdu 5544 Ba Gua Zhen(线性基+dfs)
- 挑棍子
- servlet和jsp的基本操作
- Map简单实例
- luogu 1425 小鱼的游泳时间
- 小程序request返回值真机和工具不一样,需要将字符串转为json
- hdu 3949 (线性基学习)
- matplotlib命令与格式:tick坐标轴主副刻度设置
- Javascipt学习笔记(Array对象)
- matlab、2
- mybatis简单学习
- 字符与字节有什么区别
- 我的编程之路
- [APUE]第四章文件和目录
- 求素数