1. 程式人生 > >Uva 11542 Square

Uva 11542 Square

題目 define pan long long work lin def 方程 name

技術分享圖片

題目中說數組中的數的最大質因子不超過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;
}

  

Uva 11542 Square