题目链接

给定素因子不大于500的n(n<=100)个正整数,从中选出任意个,其乘积是完全平方数,问有都少中选法。

分析:若直接枚举所有子集,有2^n种难以承受,换种思路,我们可以用Xi来表示是否选第i个数 ,由于每个素因子必须是偶次幂,故可对每个素因子列出一个模2的方程。 然后问题就转换为求这个线性方程组的自由变量个数了(即方程个数 - 增广矩阵的秩)。

比如:n=2个数  8 =2^3 、 9 = 3^2

有两个素因子2和3,可列出两个方程:

3*X1 + 0*X2 = 0 (mod2)                     等价于 :                        X1 +0*X2 = 0

0*X1 + 2*X2 = 0 (mod2)                                                            0*X1 + 0*X2 = 0

其中只有1个有效方程,即秩为1。

这代表什么意思呢? X1 = 0 , 表示8一定不能选 , X2不确定,表示9可以选择也可以不选。

因此答案为 2^1 - 1  = 1   (因为不允许一个都不选,所以减一)

参考代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn = 110;
const int maxw = 4;
typedef unsigned int Mat[maxn][maxw];const int max_pri = 500;
bool flag[max_pri+1];
int prime[max_pri / 4];
Mat m;int table_prime(){int cnt = 0 , m = sqrt(max_pri+0.5);for(int i=2;i<=m;i++) if(!flag[i]) {for(int j=i*i ; j<=max_pri ;j+=i) flag[j] = true;}for(int i=2;i<=max_pri;i++) if(!flag[i])prime[cnt++] = i;return cnt;
}
int Rank(Mat&m ,int R,int C){ //求矩阵的秩int r=0,c=0,k,i,j,u,v;while(r<R && c<C){k = r , u=c/32 , v=c%32;for(i=r+1;i<R;i++) {if(m[i][u]&(1<<v)) {k=i; break; }}if(m[k][u]&(1<<v)){if(k!=r) for(i=0;i<maxw;i++) swap(m[k][i] ,m[r][i]);for(i=r+1;i<R;i++) if(m[i][u]&(1<<v)) {for(j=0;j<maxw;j++) m[i][j] ^=m[r][j];}r++;}c++;}return r;
}int main()
{int M = table_prime();int TT;scanf("%d",&TT);while(TT--){int n , maxp = 0 , u,v;LL x;scanf("%d",&n);memset(m,0,sizeof(m));for(int i=0;i<n;i++){u = i/32 , v = i%32;scanf("%lld" , &x);for(int k = 0;k<M;k++){while(x%prime[k] == 0) {x /= prime[k];m[k][u] ^= (1<<v);maxp = max(maxp , k+1);}}}int free = n - Rank(m,maxp,n);LL ans = (1LL << free) - 1;printf("%lld\n",ans);}return 0;
}

UVA 11542 Square(求增广矩阵的秩)相关推荐

  1. 如何用计算机求增广矩阵的秩,增广矩阵的秩.ppt

    增广矩阵的秩 * 主要内容: 一.矩阵的秩 二.一般线性方程组的解 三.矩阵的秩及其求法 7.5 一般线性方程组 矩阵的秩是矩阵的重要特性之一,它在线性 方程组解的讨论中起着关键的作用. 定义:矩阵A ...

  2. 增广矩阵的秩判断解的个数_系数矩阵与增广矩阵的秩如何判断

    展开全部 方法:阶级矩阵,两行不为e68a8462616964757a686964616f313334313766390的"行",所以秩为2.矩阵,行的秩等于列的秩.纯粹只为矩阵求 ...

  3. xor方程组消元 UVA 11542 Square

    题目传送门 题意:给n个数,选择一些数字乘积为平方数的选择方案数.训练指南题目. 分析:每一个数字分解质因数.比如4, 6, 10, 15,, , , , 令,表示选择第i个数字,那么,如果p是平方数 ...

  4. 最短增广路Isap算法 网络流

    最短增广路 请先理解 bfs的求增广路的算法,再来学习Isap算法 最短增广路Isap算法 图片来源 <趣学算法>人民邮电出版社 陈小玉 /* 最短可增广路:重贴标签算法Isap 算法设计 ...

  5. RPCA的算法推导-增广拉格朗日乘子法- PPT讲解

    大家好,今天我要讲的是RPCA,那么什么是RPCA呢,它又有什么作用呢,在这里我分了四个部分去讲,背景和意义,RPCA的研究内容,也就是算法的推导,RPCA在现实中的应用.在很多的具体问题中,我们可以 ...

  6. 网络流—Edmonds-Karp 最短增广路算法(最大流)

    网络流----Edmonds-Karp 最短增广路算法 ■求最大流的过程,就是不断找到一条源到汇的路径,然后构建残余网络,再在残余网络上寻找新的路径,使总流量增加,然后形成新的残余网络,再寻找新路径- ...

  7. 计算机视觉的数据增广技术大盘点!附涨点神器,已开源!

    如果要把深度学习开发过程中几个环节按重要程度排个序的话,相信准备训练数据肯定能排在前几位.要知道一个模型网络被编写出来后,也只是一坨代码而已,和智能基本不沾边,它只有通过学习大量的数据,才能学会如何作 ...

  8. Mixup vs. SamplePairing:ICLR2018投稿论文的两种数据增广方式

    在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...

  9. 最小费用最大流-SPFA-多路增广

    背景 在最近的模拟赛当中,我碰到了一题二分图最大权匹配的题,建图比较简单,因为是IOI赛制,所以可以爆OJ,然后呢,打了一发普通的spfa费用流,跑的很慢诶,只拿了70分,都有人AC了呢.那天的讲题, ...

最新文章

  1. C语言——实现用链表存储学生信息,当输入0退出输入,并查找学号为3的学生是否存在
  2. 《《python基础》》
  3. 首届“腾讯云+社区开发者大会”正在直播!
  4. Adadelta原文解读
  5. linux学习之lvm-逻辑卷管理器
  6. linux module 目录,/sys/module/ 模块信息目录与/proc/modules文件
  7. 做人不能太心软,这三件事上,越狠心就越受益
  8. java 配置dbcp_java – 使用DBCP进行Tomcat配置
  9. opencv图像去雾改进
  10. 手机微信连不上wifi服务器怎么回事,微信连不上wifi怎么办?
  11. android定位4g不准,定位不准/失败的处理方法
  12. 【科普】Scrum——从橄榄球争球到敏捷开发
  13. 虚幻引擎(UE4)场景漫游交互项目制作
  14. 【JavaScript】 一万字 JavaScript 笔记(详细讲解 + 代码演示 + 图解)
  15. 禾穗HERS | 职场新人第一定律
  16. 第939期机器学习日报(2017-04-14)
  17. GoDEX条码打印机批量打印条码设置
  18. Springboot+Springmvc实现登录拦截(附源码)
  19. 兰燕-杨平平的需求建议
  20. 对学校的希望和寄语_新学期对学校的寄语

热门文章

  1. 一键导入excel到数据库的最佳实践
  2. LCD接口设计系列二:基于LVDS接口屏的硬件电路设计
  3. DCDC开关电源控制器设计过程(补偿网络设计)
  4. libcurl库使用详情、libcurl库的制作
  5. 华北/华东计算研究所,考研科目大改动!
  6. 【预训练GAN】Projected GANs Converge Faster
  7. python求三个数的最大值编程_python 判断三个数字中的最大值实例代码
  8. 安装VMware EXSI
  9. tekla16.0刷号程序
  10. linux复制文件夹排除文件,【linux】复制文件夹中文件,排除部分文件