[UVA11542] Square 高斯消元

来源:互联网 发布:mac airdrop在哪 编辑:程序博客网 时间:2024/05/22 00:35

显然我们需要将数唯一分解 显然只有质因子质数为偶数才可能是完全平方数 于是可以由此得出xor方程组 高斯消元求出方程的秩 (1 << 自由因子 )-1即为答案(去掉0)

#include<cstdio>#include<algorithm>#include<cstdlib>#include<cstring>#include<cmath>using namespace std;#define MAXN 500#define MAXM 400int Prime[MAXN+10], P, used;bool isprime(int x){int t = sqrt(x) + 0.5;if(x == 1) return false;for(int i = 2; i <= t; i++) if(x % t == 0) return false;return true;}void get_prime(){for(int i = 1; i <= MAXN; i++)if(isprime(i))Prime[P++] = i;}template <int maxn, int maxm>struct I_Maxtrix{int N, M, rank;I_Maxtrix() {}I_Maxtrix(int x, int y) { N = x; M = y; }int A[maxn+10][maxm+10];void init() { memset(A, 0, sizeof(A)); }void read(){for(int i = 0; i < N; i++)for(int j = 0; j <= M; j++)scanf("%lf", &A[i][j]);}void Guss(){int i = 0, j = 0;//swap(N, M);while(i < N && j < M){int r = i;for(int k = i; k < N; k++) if(A[k][j]) { r = k; break; }if(A[r][j]){if(r != i) for(int k = 0; k <= M; k++) swap(A[r][k], A[i][k]);for(int u = i+1; u < N; u++)if(A[u][j])for(int k = i; k <= M; k++)A[u][k] ^= A[i][k];i++;}j++;}rank = i;}};I_Maxtrix <MAXN, MAXM> A;void Div(long long x, int pos){for(int i = 0; i < P; i++)while(x % Prime[i] == 0) {A.A[i][pos] ^= 1;x /= Prime[i];used = max(used, i);}}int main(){get_prime();int n, m, kase;scanf("%d", &kase);while(kase--){scanf("%d", &n);A.M = n;A.init();for(int i = 0; i < n; i++){long long x;scanf("%lld", &x);Div(x, i);}A.N = used+1;A.Guss();int ans = n-(A.rank);printf("%lld\n", (1LL << (ans))-1);}}


0 0