HDU3949:XOR 高斯消元求线性基+二进制拆分
2016-02-04 09:15
387 查看
Orz hzwer
#include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; int now,zero; ll a[10005]; int T,n,m; inline ll read() { ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } inline void Gauss() { int y; now=1; zero=0; for (int k=60;~k;k--) { for (y=now;y<=n;y++) if ((1ll<<k)&a[y]) break; if (y>n) continue; if (now!=y) swap(a[now],a[y]); for (int i=1;i<=n;i++) if (i!=now&&((1ll<<k)&a[i])) a[i]^=a[now]; now++; } now--; if (now!=n) zero=1; } ll query(ll x) { ll ans=0; x-=zero; if (!x) return 0; if (x>=(1ll<<now)) return -1; for (int i=1;i<=now;i++) if (x&(1ll<<(now-i))) ans^=a[i]; return ans; } int main() { T=read(); for (int t=1;t<=T;t++) { n=read(); for (int i=1;i<=n;i++) a[i]=read(); Gauss(); m=read(); printf("Case #%d:\n",t); while (m--) { int x=read(); printf("%lld\n",query(x)); } } return 0; }
相关文章推荐
- 日经春秋 20160204
- Nodejs中session的简单使用及通过session实现身份验证的方法
- 如何清理自由天空减肥工具产生的免疫文件夹“KEYFree2008”
- cgotravel.com-yi旅项目的想法
- kotlin android
- Oracle中Left Outer Join和外关联(+)的区别
- 天声人語 20160204 あるまじき「清原容疑者」
- SWIFT学习笔记01
- 微信新消息,任务栏一闪一闪问题处理
- c#,字典,Dictionary
- 树莓派 CentOS 系统下载地址
- HDU 2037:今年暑假不AC
- ExtJs 入门教程
- HDU 1042 N! 高精度乘法
- WCF入门教程五[WCF的通信模式]
- Java api 入门教程 之 JAVA的Date类与Calendar类
- 分布式缓存学习总结
- 商业英语句型16
- 项目记录19--tolua封装自己的View层01记版录
- WCF入门教程四[WCF的配置文件]