UVA 11542 Square(求增广矩阵的秩)
题目链接
给定素因子不大于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(求增广矩阵的秩)相关推荐
- 如何用计算机求增广矩阵的秩,增广矩阵的秩.ppt
增广矩阵的秩 * 主要内容: 一.矩阵的秩 二.一般线性方程组的解 三.矩阵的秩及其求法 7.5 一般线性方程组 矩阵的秩是矩阵的重要特性之一,它在线性 方程组解的讨论中起着关键的作用. 定义:矩阵A ...
- 增广矩阵的秩判断解的个数_系数矩阵与增广矩阵的秩如何判断
展开全部 方法:阶级矩阵,两行不为e68a8462616964757a686964616f313334313766390的"行",所以秩为2.矩阵,行的秩等于列的秩.纯粹只为矩阵求 ...
- xor方程组消元 UVA 11542 Square
题目传送门 题意:给n个数,选择一些数字乘积为平方数的选择方案数.训练指南题目. 分析:每一个数字分解质因数.比如4, 6, 10, 15,, , , , 令,表示选择第i个数字,那么,如果p是平方数 ...
- 最短增广路Isap算法 网络流
最短增广路 请先理解 bfs的求增广路的算法,再来学习Isap算法 最短增广路Isap算法 图片来源 <趣学算法>人民邮电出版社 陈小玉 /* 最短可增广路:重贴标签算法Isap 算法设计 ...
- RPCA的算法推导-增广拉格朗日乘子法- PPT讲解
大家好,今天我要讲的是RPCA,那么什么是RPCA呢,它又有什么作用呢,在这里我分了四个部分去讲,背景和意义,RPCA的研究内容,也就是算法的推导,RPCA在现实中的应用.在很多的具体问题中,我们可以 ...
- 网络流—Edmonds-Karp 最短增广路算法(最大流)
网络流----Edmonds-Karp 最短增广路算法 ■求最大流的过程,就是不断找到一条源到汇的路径,然后构建残余网络,再在残余网络上寻找新的路径,使总流量增加,然后形成新的残余网络,再寻找新路径- ...
- 计算机视觉的数据增广技术大盘点!附涨点神器,已开源!
如果要把深度学习开发过程中几个环节按重要程度排个序的话,相信准备训练数据肯定能排在前几位.要知道一个模型网络被编写出来后,也只是一坨代码而已,和智能基本不沾边,它只有通过学习大量的数据,才能学会如何作 ...
- Mixup vs. SamplePairing:ICLR2018投稿论文的两种数据增广方式
在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...
- 最小费用最大流-SPFA-多路增广
背景 在最近的模拟赛当中,我碰到了一题二分图最大权匹配的题,建图比较简单,因为是IOI赛制,所以可以爆OJ,然后呢,打了一发普通的spfa费用流,跑的很慢诶,只拿了70分,都有人AC了呢.那天的讲题, ...
最新文章
- C语言——实现用链表存储学生信息,当输入0退出输入,并查找学号为3的学生是否存在
- 《《python基础》》
- 首届“腾讯云+社区开发者大会”正在直播!
- Adadelta原文解读
- linux学习之lvm-逻辑卷管理器
- linux module 目录,/sys/module/ 模块信息目录与/proc/modules文件
- 做人不能太心软,这三件事上,越狠心就越受益
- java 配置dbcp_java – 使用DBCP进行Tomcat配置
- opencv图像去雾改进
- 手机微信连不上wifi服务器怎么回事,微信连不上wifi怎么办?
- android定位4g不准,定位不准/失败的处理方法
- 【科普】Scrum——从橄榄球争球到敏捷开发
- 虚幻引擎(UE4)场景漫游交互项目制作
- 【JavaScript】 一万字 JavaScript 笔记(详细讲解 + 代码演示 + 图解)
- 禾穗HERS | 职场新人第一定律
- 第939期机器学习日报(2017-04-14)
- GoDEX条码打印机批量打印条码设置
- Springboot+Springmvc实现登录拦截(附源码)
- 兰燕-杨平平的需求建议
- 对学校的希望和寄语_新学期对学校的寄语