题意:

给出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的更多相关文章

  1. Light OJ 1288 Subsets Forming Perfect Squares 高斯消元求矩阵的秩

    题目来源:Light OJ 1288 Subsets Forming Perfect Squares 题意:给你n个数 选出一些数 他们的乘积是全然平方数 求有多少种方案 思路:每一个数分解因子 每隔 ...

  2. [LintCode] Perfect Squares 完全平方数

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...

  3. LeetCode Perfect Squares

    原题链接在这里:https://leetcode.com/problems/perfect-squares/ 题目: Given a positive integer n, find the leas ...

  4. Perfect Squares

    Perfect Squares Total Accepted: 18854 Total Submissions: 63048 Difficulty: Medium Given a positive i ...

  5. CF914A Perfect Squares

    CF914A Perfect Squares 题意翻译 给定一组有n个整数的数组a1,a2,…,an.找出这组数中的最大非完全平方数. 完全平方数是指有这样的一个数x,存在整数y,使得x=y^2y2  ...

  6. [LeetCode] 0279. Perfect Squares 完全平方数

    题目 Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9 ...

  7. LeetCode 279. 完全平方数(Perfect Squares) 7

    279. 完全平方数 279. Perfect Squares 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数 ...

  8. Leetcode之广度优先搜索(BFS)专题-279. 完全平方数(Perfect Squares)

    Leetcode之广度优先搜索(BFS)专题-279. 完全平方数(Perfect Squares) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ar ...

  9. 花式求解 LeetCode 279题-Perfect Squares

    原文地址 https://www.jianshu.com/p/2925f4d7511b 迫于就业的压力,不得不先放下 iOS 开发的学习,开始走上漫漫刷题路. 今天我想聊聊 LeetCode 上的第2 ...

随机推荐

  1. Cent OS下发送邮件

    首先安装发送邮件的服务: yum install -y sendmail 安装完成之后在安装mutt yum install -y mutt 安装完成之后我们就可以发送邮件了 mutt     tes ...

  2. 英特尔和Red Hat合作实现Gnome桌面的Wayland支持

    在发布支持XMir的Linux图形驱动程序xf86-video-intel 2.99.901后数天,英特尔宣布撤回对XMir的支持,XMir补丁不会合并到上游项目.XMir是Mir显示服务器的X11兼 ...

  3. hdu 2842(矩阵高速幂+递推)

    题意:一个中国环的游戏,规则是一个木棒上有n个环.第一个环是能够任意放上或拆下的,剩下的环x假设想放上或拆下必须前一个环x-1是放上的且前x-2个环所有是拆下的,问n个环最少多少次操作能够所有拆掉. ...

  4. 使用unidac 连接FB 3.0 (含嵌入版)

    unidac  是delphi 最强大的数据库连接控件,没有之一.详细信息可以通过官网了解. Firebird是一个跨平台的关系数据库系统,目前能够运行在Windows.linux和各种Unix操作系 ...

  5. 1367: [Baltic2004]sequence

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1090  Solved: 432 [Submit ...

  6. 2018.11.23-day27 面向对象(大总结)

    1. 2个内置函数 2.反射 3.内置方法 4.面向对象大总结 思维导图地址:https://www.processon.com/view/link/5bfcfd62e4b0ef094cbf04a7  ...

  7. java之异常的捕获及处理

    在java中程序的错误主要是语法错误和语义错误(也就是逻辑错误). java中异常处理语句的格式: try{ //有可能出现异常的语句 }catch(异常类 异常对象){ //编写异常的处理语句 }c ...

  8. SAP建数据库索引

    [转]SAP建数据库索引   %_hints  db6 'INDEX("MKPF","MKPF~BUD")'           db6 'INDEX(&quo ...

  9. Proxy Pattern

    1.Proxy Pattern最大的好处就是实现了逻辑和实现的彻底解耦. 2.Proxy Pattern结构图 3.实现 #ifndef _PROXY_H_ #define _PROXY_H_ cla ...

  10. Nodejs下如何判断文件夹的存在以及删除文件夹下所有的文件

    代码如下: var folder_exists = fs.existsSync('./cache'); if(folder_exists == true) { var dirList = fs.rea ...