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 ...
随机推荐
- 微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服
微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服 2014/10/08 · Testin · 开发人员訪谈 2013年11月1日,谷歌运行董事长施密特(Eric Emerson Sch ...
- YAML 对中文的处理
from yaml import load,dump f = open('xx.ymal',encoding='utf-8') l = load(f) print(f) w = open('xx_co ...
- 简述C++中的多态机制
前言 封装性,继承性,多态性是面向对象语言的三大特性.其中封装,继承好理解,而多态的概念让许多初学者感到困惑.本文将讲述C++中多态的概念以及多态的实现机制. 什么是多态? 多态就是多种形态,就是许多 ...
- EasyDarwin手机直播是如何实现的快速显示视频的方法
前言 经常有人提到最近比较火的映客直播.花椒直播这种,是如何做到在打开手机直播中的某一个主播房间后,立即就能显示出主播视频,非常非常快,而且延时也比较小,是怎么做到的? 其实,这并不是什么高深的技术, ...
- poj 1286 Necklace of Beads poj 2409 Let it Bead HDU 3923 Invoker <组合数学>
链接:http://poj.org/problem?id=1286 http://poj.org/problem?id=2409 #include <cstdio> #include &l ...
- [Phoenix] 四、加盐表
摘要: 在密码学中,加盐是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串.这个在散列中加入字符串的方式称为“加盐”.其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情 ...
- 稳定币GUSD的优劣势分析
在币圈,有人乘着牛市东风一夜暴富,也有人不幸赶上熊市倾家荡产,涨跌大起大落是币圈的常态,在如此不稳定的币市,投资者们都想寻求一些稳定.接着,稳定币诞生了. 2018年下半年,稳定币引起了各路投资者的高 ...
- 1.JavaScript:写入 HTML 输出
①JavaScript 是可插入HTML页面的编程代码 ②JavaScript插入HTML页面后,可有所有的现代浏览器执行 ※提示:您只能在 HTML 输出中使用 document.write.如果您 ...
- AbstractFactory Pattern
AbstractFactory模式用来解决这类问题:要创建一组相关或者相互依赖的对象. AbstractFactory Pattern结构图 实现: #ifndef _PRODUCT_H_ #defi ...
- bzoj4670: 佛罗里达
这题直接随机化+贪心就可以爆踩过去,我加了个退火增加容错率而已....其实你随机的次数够多根本不需要... 然后来自肉丝哥哥的正经做法: 先钦定D(A)>D(B),那么可以枚举D(A),然后再去 ...