https://vjudge.net/problem/UVA-11542

xor高斯消元。。。

答案为2^f-1

其实书上有一个问题

样例有3种情况,其中4,6,15是绑在一起的,也就是他们必须满足一定的选或不选的关系。当一个变量是自由的,当且仅当他的所有的幂%2==0,也就是说这个数是一个完全平方数,否则这个数的选择肯定会影响到其他数。

那么我们可以吧所有数分为有界变量和自由变量,就是确定选或不选和可选可不选,确定选或不选看做一个大的元素,因为他们选或不选组成的集合也是一个完全平方数,也就是一个自由变量。那么我们得答案就是1<<(自由变量+1)-1 ,-1是空集。+1是有界变量的组合体。

书上的样例解释应该是错的,自由变量只有x1,而为什么程序能对大概是因为下标是从0开始,正好规避了那个加一,不知道对不对,求打脸。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n, lim;
int a[N][N], p[N], mark[N];
void Init()
{
for(int i = ; i <= ; ++i)
{
if(!mark[i]) p[++p[]] = i;
for(int j = ; j <= p[] && i * p[j] <= ; ++j)
{
mark[i * p[j]] = ;
if(i % p[j] == ) break;
}
}
}
int gauss_jordan(int lim)
{
int row = , col = ; //col 列
for(; row <= lim && col <= n; ++col)
{
int x = ;
for(int i = row; i <= lim; ++i) if(a[i][col] == ) { x = i; break; }
if(!x) continue;
for(int i = ; i <= n + ; ++i) swap(a[row][i], a[x][i]);
for(int i = ; i <= lim; ++i) if(a[i][col] && i != row)
for(int j = ; j <= n + ; ++j) a[i][j] ^= a[row][j];
++row;
}
return row;
}
int main()
{
Init();
int T; scanf("%d", &T);
while(T--)
{
lim = ;
memset(a, , sizeof(a));
scanf("%d", &n);
for(int i = ; i <= n; ++i)
{
ll x; scanf("%lld", &x);
for(int j = ; j <= p[]; ++j)
{
if(p[j] > x) break;
lim = max(lim, j);
while(x % p[j] == ) { x /= p[j]; a[j][i] ^= ; }
}
}
int x = gauss_jordan(lim) - ;
printf("%lld\n", (1ll << (ll)(n - x)) - );
}
return ;
}

uva11542的更多相关文章

  1. UVA11542 Square(高斯消元 异或方程组)

    建立方程组消元,结果为2 ^(自由变元的个数) - 1 采用高斯消元求矩阵的秩 方法一: #include<cstdio> #include<iostream> #includ ...

  2. UVa11542 Square

    /*by SilverN*/ #include<iostream> #include<algorithm> #include<cstring> #include&l ...

  3. HDU 5833 Zhu and 772002 (高斯消元)

    Zhu and 772002 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5833 Description Zhu and 772002 are b ...

随机推荐

  1. centos相关

    查看虚拟机里的Centos7的IP:ip addr或者ifconfig  ---https://blog.csdn.net/dancheren/article/details/73611878 Cen ...

  2. Android BGABadgeView:BGABadgeImageView以及BGABadgeRelativeLayout(4)

     Android BGABadgeView:BGABadgeImageView以及BGABadgeRelativeLayout(4) 在附录文章5,6,7的基础上,写一个小例子说明BGABadge ...

  3. hdu 1166 树状数组模板题

    #include<stdio.h> #include<string.h> #define N  51000 int  c[N],n; int number(int x) { r ...

  4. Linux下Apache服务部署静态网站------网站服务程序

    文章链接(我的CSDN博客): Linux下Apache服务部署静态网站------网站服务程序

  5. Caocao's Bridges-HDU4738(Tarjin+求桥)

    http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意: 给定n个点和m条边  和每条边的价值,求桥的最小价值(最小桥) 看着挺简单的但是有好多细节: ...

  6. ETL全量单表同步简述

    ETL全量单表同步简述 1. 实现需求 当原数据库的表有新增.更新.删除操作时,将改动数据同步到目标库对应的数据表. 2. 设计思路 设计总体流程图如下: 注意点: 1.数据库合并时,选择正确的数据源 ...

  7. day4-hdfs的核心工作原理\写数据流程 \读数据流程

    namenode元数据管理要点 1.什么是元数据? hdfs的目录结构及每一个文件的块信息(块的id,块的副本数量,块的存放位置<datanode>) 2.元数据由谁负责管理? namen ...

  8. MapReduce的Reduce side Join

    1. 简单介绍 reduce side  join是全部join中用时最长的一种join,可是这样的方法可以适用内连接.left外连接.right外连接.full外连接和反连接等全部的join方式.r ...

  9. Jenkins 使用

    Jenkins 安装 Jenkins是用Java语言开发的系统,首先要确定服务器上已经安装JDK或者JRE. 安装方式一 直接运行java –jar Jenkins.war,在浏览器中输入 http: ...

  10. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...