【题目分析】

每个数没有超过500的因子。很容易想到把每一个数表示成一个二进制的数。

(0代表该质数的次数为偶数,1代表是奇数)

然后问题转化成了选取一些二进制数,使他们的异或和为0。

高斯消元,2^(自由元)即为答案,需要把空集的情况减去,所以减一。

然而发现并不需要知道哪些是自由元,所以只需要用线性基去维护即可。

然后代码就呼之欲出了。

【代码】

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>

#include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 500005
#define ll long long
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)

void Finout()
{
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	#endif
}

int Getint()
{
	int x=0,f=1; char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') x=x*10+ch-'0';
	return x*f;
}

ll Getll()
{
	ll x=0,f=1; char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') x=x*10+ch-'0';
	return x*f;
}

int pri[205],top;

void init()
{
	F(i,2,500)
	{
		int flag=1;
		F(j,2,sqrt(i)) if (i%j==0) flag=0;
		if (flag) pri[++top]=i;
	}
//	F(i,1,top) cout<<pri[i]<<" ";
//	cout<<"over"<<endl;
}

int t,a[205][205],n,cnt;
int lb[205][205],hav[205];

int main()
{
	Finout();
	init();
	scanf("%d",&t);
//	cout<<t<<endl;
	while (t--)
	{
//		cout<<"test "<<t<<endl;
		memset(hav,0,sizeof hav);
		memset(lb,0,sizeof lb);
		memset(a,0,sizeof a);
		cnt=0;
		scanf("%d",&n);
		F(i,1,n)
		{
			ll x; scanf("%lld",&x);
//			cout<<"now is "<<x<<endl;
			F(j,1,top)
			{
				while (x%pri[j]==0)
				{
					a[i][j]=!a[i][j];
					x/=pri[j];
//					cout<<j<<" ^ 1"<<endl;
				}
			}
//			cout<<i<<": ";
//			D(j,top,1) cout<<a[i][j]; cout<<endl;
		}
		F(i,1,n)
		{
			int flag=0;
			D(j,top,1)
			{
				if (a[i][j])
				{
//					cout<<"have in "<<j<<endl;
					if (!hav[j])
					{
//						cout<<"put a"<<endl;
//						D(k,top,1) cout<<a[i][k]; cout<<endl;
						D(k,j,1) lb[j][k]=a[i][k];
						hav[j]=1;
						flag=1;
						break;
					}
					else
					{
//						cout<<"star to ^"<<endl;
						D(k,j,1) a[i][k]^=lb[j][k];
//						D(k,top,1) cout<<a[i][k]; cout<<endl;
					}
				}
			}
			if (!flag) cnt++;
		}
		cout<<(1LL<<cnt)-1<<endl;
	}
}

  

UVA 11542 Square ——线性基的更多相关文章

  1. UVA 11542 - Square(高斯消元)

    UVA 11542 - Square 题目链接 题意:给定一些数字.保证这些数字质因子不会超过500,求这些数字中选出几个,乘积为全然平方数,问有几种选法 思路:对每一个数字分解成质因子后.发现假设要 ...

  2. xor方程组消元 UVA 11542 Square

    题目传送门 题意:给n个数,选择一些数字乘积为平方数的选择方案数.训练指南题目. 分析:每一个数字分解质因数.比如4, 6, 10, 15,, , , , 令,表示选择第i个数字,那么,如果p是平方数 ...

  3. UVa 11542 Square (高斯消元)

    题意:给定 n 个数,从中选出一个,或者是多个,使得选出的整数的乘积是完全平方数,求一共有多少种选法,整数的素因子不大于 500. 析:从题目素因子不超过 500,就知道要把每个数进行分解.因为结果要 ...

  4. Uva 11542 Square

    题目中说数组中的数的最大质因子不超过500,我们筛出≤500的质数,然后考虑对每个质数列一个方程组.. 然后这几乎就是高斯消元求解异或方程组的模板题了.... 注意答案是 2^(自由元数量)-1,因为 ...

  5. UVA 11542 Square 高斯消元 异或方程组求解

    题目链接:点击打开链接 白书的例题练练手. . . P161 #include <cstdio> #include <iostream> #include <algori ...

  6. Codeforces 895C Square Subsets(状压DP 或 异或线性基)

    题目链接  Square Subsets 这是白书原题啊 先考虑状压DP的做法 $2$到$70$总共$19$个质数,所以考虑状态压缩. 因为数据范围是$70$,那么我们统计出$2$到$70$的每个数的 ...

  7. 洛谷CF895C Square Subsets(线性基)

    洛谷传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 题意: 给你n个数,每个数<=70,问有多少个集合,满足集合中所有数相乘是个完全平方数(空集除外) 题解: 完全看不出这玩意儿和线性基有什 ...

  8. CF895C Square Subsets [线性基]

    线性基的题- 考虑平方数只和拆解质因子的个数的奇偶性有关系 比如说你 \(4\) 和 \(16\) 的贡献都是一样的.因为 \(4 = 2^2 , 16 = 2^4\) \(2\) 和 \(4\) 奇 ...

  9. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

随机推荐

  1. [转]Android 导入v7包常见错误,以及项目引用v7包错误解决

    android下v4    v7   v21等包是android系统的扩展支持包,就想windows的系统补丁一个道理. android的扩展包主要是用来兼容低版本的,比如android3.0以后出现 ...

  2. HTML一些小细节

    这里主要是记录一些看起来不重要,但是其实作用不小或者使用起来某种情况下好用的东西,又或者是重要的但容易忽略的基础知识 1. HTML5之后的第一个标签是<!DOCTYPE html> 这个 ...

  3. TweenMax说明

    TweenMax 采用了与它的兄弟相似的易于学习的语法结构.实事上,因为它扩展自它们,TweenMax 可以做任何 TweenLite 和/或者 TweenFilterLite 能做的事,还加上了更多 ...

  4. Mysql limit性能优化(小offset与大offset)

    MySQL的优化是非常重要的.其他最常用也最需要优化的就是limit.MySQL的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降.   同样是取10条数据 selec ...

  5. 转:loadruner报错:Step download timeout(120 seconds)的一个解决方法

    一个网友问了我一个问题如下:loadruner报错:Error -27728: Step download timeout (120 seconds) 如何解决语法检查通过,但是在并发执行一个查询时候 ...

  6. try...catch...finally...return的四角恋

    java里的try...catch...finally的三角恋关系众多程序员必然是不陌生的.但是他们三者再加上一个return的话,就会难倒一大片人吧.以前就对这个知道这个问题,没系统的总结一下,结果 ...

  7. Html基础详解之(jquery)之二

    on(events,[selector],[data],fn) 在选择元素上绑定一个或多个事件的事件处理函数.on()方法绑定时间处理程序到当前选定的jQuery对象中的元素.在jQuery 1.7中 ...

  8. angularJS 系列(六)---$emit(), $on(), $broadcast()的使用

    下面以一个例子来讲述 angular 中的event system,有$emit(), $on(), $broadcast().效果图如下 下面的代码中,用到了 controller AS 的语法,具 ...

  9. Vacations

    Vacations Vasya has n days of vacations! So he decided to improve his IT skills and do sport. Vasya ...

  10. ubuntu 15.04怎么安装QQ

    ubuntu 15.04怎么安装QQ | 浏览:468 | 更新:2015-07-21 10:20 1 2 3 4 5 6 7 分步阅读 新装的ubuntu不能没有QQ,我们需要安装QQ来进行及时交流 ...