首页 > 代码库 > UVA 11542 Square 高斯消元 异或方程组求解

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

题目链接:点击打开链接

白书的例题练练手。。。P161

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define ll int
#define LL long long
const int mod = 1000000009;
const int maxn = 510;
const int maxp = 100;
ll prime[1000],primenum;//有primenum个素数 math.h
void PRIME(ll Max_Prime){
	primenum=0;
	prime[primenum++]=2;
	for(ll i=3;i<=Max_Prime;i+=2)
	for(ll j=0;j<primenum;j++)
		if(i%prime[j]==0)break;
		else if(prime[j]>sqrt((double)i) || j==primenum-1)
		{
			prime[primenum++]=i;
			break;
		}
}

typedef int Matrix[maxn][maxn];

int rank(Matrix A, int m, int n) { //m个方程n个变量
    int i = 0, j = 0, k, r, u;
    while(i < m && j < n)
    {
        r = i;
        for(k = i; k < m; k++)
            if(A[k][j])
                { r = k; break; }
        if(A[r][j])
        {
            if(r != i)
                for(k = 0; k <= n; k++) swap(A[r][k], A[i][k]);
            for(u = i+1; u < m; u++) if(A[u][j])
                for(k = i; k <= n; k++) A[u][k] ^= A[i][k];
            i++;
        }
        j++;
    }
    return i;
}

Matrix A;

int main(){
    PRIME(500);
    int T; cin>>T;
    while(T--) {
        int n, maxp = 0;
        long long x;
        cin>> n;
        memset(A, 0, sizeof A);
        for(int i = 0; i < n; i++)
        {
            cin>> x;
            for(int j = 0; j < primenum; j++)
                while(x % prime[j] == 0)
            {
                maxp = max(maxp, j);
                x /= prime[j];
                A[j][i] ^= 1;
            }
        }
        int r = rank(A, maxp+1, n);
        cout<< (1LL << (n-r))-1 <<endl;
    }
    return 0;
}