Uva 11542 Square

 

题目中说数组中的数的最大质因子不超过500,我们筛出≤500的质数,然后考虑对每个质数列一个方程组。。

然后这几乎就是高斯消元求解异或方程组的模板题了。。。。

注意答案是 2^(自由元数量)-1,因为空集不是答案的一部分。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#define ll long long
#define maxn 125
using namespace std;
int zs[505],t=0;
bool v[505];

inline void init(){
	for(int i=2;i<=500;i++){
		if(!v[i]) zs[++t]=i;
		for(int j=1,u;j<=t&&(u=zs[j]*i)<=500;j++){
			v[u]=1;
			if(!(i%zs[j])) break;
		}
	}

}

int a[maxn][maxn];
int T,n,m;
ll now;

inline void prework(int x){
	for(int i=1;i<=t;i++) if(!(now%zs[i])){
		int c=0;
		while(!(now%zs[i])) now/=(ll)zs[i],c^=1;
		a[i][x]=c;
	}
}

inline int solve(){
	int i=1,j=1;
	//当前处理到第i个方程,第j个变量 
	while(i<=t&&j<=n){
		for(int k=i;k<=t;k++) if(a[k][j]){
			if(k!=i) for(int l=j;l<=n;l++) swap(a[k][l],a[i][l]);
			break;
		}
		
		if(a[i][j]){
			for(int k=i+1;k<=t;k++) if(a[k][j])
			    for(int l=j;l<=n;l++) a[k][l]^=a[i][l];
			i++;
		}
		j++;
	}
	
	return i-1;
}

int main(){
	init();
	
	scanf("%d",&T);
	while(T--){
		memset(a,0,sizeof(a));
		scanf("%d",&n);
		
		for(int i=1;i<=n;i++){
			scanf("%lld",&now);
			prework(i);
		}
		
		int d=solve();
		
		printf("%lld\n",((ll)1<<(ll)(n-d))-1ll);
	}
	
	return 0;
}

  

 

转载于:https://www.cnblogs.com/JYYHH/p/8447421.html

微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值