博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SGU 275 To xor or not to xor
阅读量:6275 次
发布时间:2019-06-22

本文共 1696 字,大约阅读时间需要 5 分钟。

SGU_275

    这个题目可以将每个数分解成64位来看待,于是我们可以从高位向低位扫描,尽可能让当前这位为1,而判断当前这位是否可能为1可以借助高斯消元。

#include
#include
#include
#define MAXN 110#define MAXM 70using namespace std;long long a[MAXN];int N, mat[MAXM][MAXN], code[MAXM][MAXN], ans[MAXM];void decode(int i){ int j; long long x = a[i]; for(j = 63; j >= 0; j --) code[j][i] = x & 1, x >>= 1;}void init(){ int i; for(i = 0; i < N; i ++) { scanf("%I64d", &a[i]); decode(i); }}int gauss(int n){ int i, j, k, x, y; for(i = j = 0; i <= n && j < N; i ++, j ++) { if(mat[i][j] == 0) { for(x = i + 1; x <= n; x ++) if(mat[x][j]) { for(y = j; y <= N; y ++) swap(mat[i][y], mat[x][y]); break; } if(x > n) { -- i; continue ; } } for(x = i + 1; x <= n; x ++) if(mat[x][j]) { for(y = j; y <= N; y ++) mat[x][y] ^= mat[i][y]; } } for(k = i; k <= n; k ++) if(mat[k][N]) return 0; return 1;}void solve(){ int i, j, k; long long res = 0; for(i = 0; i < 64; i ++) { ans[i] = 1; for(j = 0; j <= i; j ++) { for(k = 0; k < N; k ++) mat[j][k] = code[j][k]; mat[j][N] = ans[j]; } if(!gauss(i)) ans[i] = 0; } for(i = 0; i < 64; i ++) res = (res << 1) | ans[i]; printf("%I64d\n", res);}int main(){ while(scanf("%d", &N) == 1) { init(); solve(); } return 0;}

转载地址:http://cugpa.baihongyu.com/

你可能感兴趣的文章
修复Postfix 的Relay access denied问题
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>
ffmpeg study 1
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
MySQL 5.6 for Windows 解压缩版配置安装
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>
Apache kafka 简介
查看>>
socket通信Demo
查看>>
技术人员的焦虑
查看>>
js 判断整数
查看>>
建设网站应该考虑哪些因素
查看>>
mongodb $exists
查看>>
js实现页面跳转的几种方式
查看>>
sbt笔记一 hello-sbt
查看>>
常用链接
查看>>
pitfall override private method
查看>>