【题目分析】

每个数没有超过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. java 创建一个File文件对象

    Example10_1.java import java.io.*; public class Example10_1 { public static void main(String args[]) ...

  2. 解决 UNMOUNTABLE_BOOT_VOLUME 蓝屏【转载】

    现象:一台XP系统的机器,开机在滚动条阶段蓝屏,蓝屏代码大概是“UNMOUNTABLE_BOOT_VOLUME”. 用PE进系统后发现C盘的文件格式变为RAW,总容量等变为0 解决方法一:将故障机的硬 ...

  3. POJ 1236 Network of Schools (tarjan算法+缩点)

    思路:使用tarjan求强连通分量并进行缩点,判断所有入度为0的点,这个点就是必须要给予文件的点,分别计算出度,入度为零的点的个数,取二者的最大值就是把这个图变成强连通需要加的边数. 一个取值需要讨论 ...

  4. ZooKeeper应用理论及其应用场景

    ZooKeeper Client APIZooKeeper Client Library提供了丰富直观的API供用户程序使用,下面是一些常用的API: ● create(path, data, fla ...

  5. TDK伪原创? 对matatags的研究总结

    /public_html/includes/modules/meta_tags.php 46行:switch ($_GET['main_page']) {这里面包括自定义页面index.php?mai ...

  6. hdu_5418_Victor and World(状压DP+Floyd)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 题意:给你n个点,和一些边,找一条路径经过全部的点,并回到起点,问最小的花费是多少, 题解:m& ...

  7. form 表单 enctype 属性-(转自w3c)

    <from action="xxx.xxx" enctype="multipart/form-data"></from> 在上传文件时必 ...

  8. myeclipse中打开java文件中文乱码

    中文乱码肯定是编码与解码不一样导致. 1.如果是平时写代码都没有问题,但是打开其他项目时出现这种问题: window->preferences->General->Content T ...

  9. java实现文件转换成二进制存储与取出

    一.功能描述: 将文件转成二进制数据放入数据库中,需要的时候,便可以取出安装与使用. 二.数据库: 建立一个数据库字段存放转成二进制的图片,这个字段有一个要求就是要设置成blob类型的 CREATE  ...

  10. android脚步---图片浏览

    简单的图片浏览器,实现图像显示与点击切换下一张 首先在main.xml里面定义一个简单的线性布局容器. <?xml version="1.0" encoding=" ...