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 ...
随机推荐
- 移植alsa-lib遇到的问题
移植alsa-lib遇到的问题 linux audio alsa lib VERSIONED_SYMBOLS 这两天移植alsa lib时遇到了一个问题,被困住了好久. 做个记录,以后再被 ...
- JAVA传输概念
1.VO(View Object):视图对象,用于展示在前台界面. 2.DTO(Data Transfer Object):数据传输对象,泛指用于展示层与服务层之间的数据传输对象. 3. DTO和VO ...
- Fckeditor常见漏洞的挖掘与利用整理汇总
查看编辑器版本号 FCKeditor/_whatsnew.html ------------------------------------------------------------- 2. V ...
- 基于bootstrap+MySQL搭建动态网站
这个只是在上个练习项目中的后台管理项目加入了MySQL,数据不是写死的,而是从数据库中获取到的,获取到数据执行增删改查操作,没什么 计数难度,不做介绍
- android:PopupWindow的使用场景和注意事项
1.PopupWindow的特点 借用Google官方的说法: "A popup window that can be used to display an arbitrary view. ...
- 深入理解Java:注解(Annotation)自己定义注解入门
深入理解Java:注解(Annotation)自己定义注解入门 要深入学习注解.我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前.我们就必须要了解Java为我们提供的元注解和相关定义注解的 ...
- EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)
-本文由EasyDarwin开源团队成员贡献 一.问题描述 Easydarwin中大量使用gettimeofday来获取系统时间,对系统性能造成了一定的影响.我们来做个测试: While(1) { G ...
- mybatis入门(十)
mybatis和hibernate本质区别和应用场景 hibernate:是一个标准ORM框架(对象关系映射).入门门槛较高的,不需要程序写sql,sql语句自动生成了. 对sql语句进行优化.修改比 ...
- MSVC环境,Qt代码包含中文无法通过构建的解决方案
将代码文件的编码更改为ANSI(方便起见,将Qt Creator的Text Editor默认编码改为System) 这样就可以通过构建,不过会出现中文乱码的问题 还需要使用QStringLiteral ...
- Xcode各个版本及模拟器下载
如果你嫌在 App Store 下载 Xcode 太慢,你也可以选择从网络上下载: Xcode下载(Beta版打的包是不能提交到App Store上的) 绝对官方源!!!绝对官方源!!!绝对官方源!! ...