Subsets Forming Perfect Squares
题意:
给出n个数字,选出若干个数字,使得这些数字的乘积是一个完全平方数,问有多少种选法。
解法:
考虑异或方程组,$x_i$表示第i个数字是否选,
注意到只要保证结果中各个质因数都出现偶数次就可保证结果是一个完全平方数。
相当于每个因数出现的次数$mod \ 2 = 0$。
这样对于每一个质因子,我们可以得到一个有n个变量的异或方程。
求矩阵中自由元的个数$cnt$,答案就是$2^{cnt}-1$
注意本题中变量数可能远大于方程数,我们不能普通地Jordan。
只要消成阶梯矩阵,并求出矩阵的秩即可。
用$bitmask$压位,可以做到$O(\frac{n^3}{64})$
#include <iostream>
#include <cstdio>
#include <cstring>
#include <bitset> #define N 2010
#define LL long long
#define P 1000000007LL using namespace std; bitset<N> g[N];
bool v[N];
int tot,prime[N];
LL a[N]; LL solve(int n,int m)
{
LL ans=1LL;
int k=;
for(int i=;i<=m;i++)
{
int t=;
for(int j=k;j<=n;j++)
if(g[j][i])
{
t=j;
break;
}
if(!t)
{
ans=ans*2LL%P;
continue;
}
swap(g[t],g[k]);
for(int j=k+;j<=n;j++)
if(j!=k && g[j][i])
g[j]^=g[k];
k++;
}
return (ans-1LL+P)%P;
} int main()
{
for(int i=;i<=;i++)
{
if(v[i]) continue;
prime[++tot]=i;
for(int j=i+i;j<=;j+=i)
v[j]=;
}
int T,n,Te=;
cin>>T;
while(T--)
{
cin>>n;
for(int i=;i<=tot;i++) g[i].reset();
for(int i=;i<=n;i++)
{
cin>>a[i];
for(int j=;j<=tot;j++)
{
LL tmp=a[i];
while(tmp%prime[j]==)
{
g[j][i]=g[j][i]^;
tmp/=prime[j];
}
}
}
printf("Case #%d:\n",++Te);
cout << solve(tot,n) << endl;
}
return ;
}
Subsets Forming Perfect Squares的更多相关文章
- Light OJ 1288 Subsets Forming Perfect Squares 高斯消元求矩阵的秩
题目来源:Light OJ 1288 Subsets Forming Perfect Squares 题意:给你n个数 选出一些数 他们的乘积是全然平方数 求有多少种方案 思路:每一个数分解因子 每隔 ...
- [LintCode] Perfect Squares 完全平方数
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...
- LeetCode Perfect Squares
原题链接在这里:https://leetcode.com/problems/perfect-squares/ 题目: Given a positive integer n, find the leas ...
- Perfect Squares
Perfect Squares Total Accepted: 18854 Total Submissions: 63048 Difficulty: Medium Given a positive i ...
- CF914A Perfect Squares
CF914A Perfect Squares 题意翻译 给定一组有n个整数的数组a1,a2,…,an.找出这组数中的最大非完全平方数. 完全平方数是指有这样的一个数x,存在整数y,使得x=y^2y2 ...
- [LeetCode] 0279. Perfect Squares 完全平方数
题目 Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9 ...
- LeetCode 279. 完全平方数(Perfect Squares) 7
279. 完全平方数 279. Perfect Squares 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数 ...
- Leetcode之广度优先搜索(BFS)专题-279. 完全平方数(Perfect Squares)
Leetcode之广度优先搜索(BFS)专题-279. 完全平方数(Perfect Squares) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ar ...
- 花式求解 LeetCode 279题-Perfect Squares
原文地址 https://www.jianshu.com/p/2925f4d7511b 迫于就业的压力,不得不先放下 iOS 开发的学习,开始走上漫漫刷题路. 今天我想聊聊 LeetCode 上的第2 ...
随机推荐
- Linux基础(1)- 命令和目录文件
1.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 Linux操作界面如图: 右击桌面,点击打开终端 输入“su”,点击回车键,出现密码,输入密码,点击回车键,显 ...
- enter键触发的函数
enter键触发的函数示例: <input type="text" onkeydown="fun();"> function fun() { if( ...
- 整理自Git文件夹下资料及man手册(不包括书籍)
$ git commit -awhich will automatically notice any modified (but not new) files, add them to the ind ...
- svn 命令个
svn 命令行下常用的几个命令 标签: svnpathdelete工作urlfile 2011-11-28 08:16 128627人阅读 评论(1) 收藏 举报 分类: 版本控制(8) 版权声明 ...
- shell-判断循环
shell条件测试 test 每个完整的合理的编程语言都具有条件判断的功能. bash可以使用test命令,[]和()操作,还有if/then结构 字符串判断 -n string 判断字符串长度非零 ...
- Integrate NSX into Neutron
NSX is VMware's strategy for Software-defined networking, it was implemented purely in software, and ...
- RFID 卡片防复制
RFID 卡片防复制 这里的卡指的 MIFARE Classic 系列 或 NTAG 系列的卡.其它的卡没接触过,不了解. 防伪有两层意义: 卡片防复制.比如小区卡被复制,使得出入小区的人员管理更困难 ...
- input输入框输入大小写字母自动转换
input输入框输入小写字母自动转换成大写字母有两种方法 1.用js onkeyup事件,即时把字母转换为大写字母: html里input加上 <input type="text&qu ...
- 基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. ...
- Jquery放大镜插件---imgzoom.js(原创)
Jquery放大镜插件imgzoom能够实现图片放大的功能,便于与原图进行比较. 使用方法: 1.引入jQuery与imgzoom,imgzoom.css <link rel="sty ...