uva 11542 Square (高斯消元)

来源:互联网 发布:vb串口校验和 编辑:程序博客网 时间:2024/06/05 19:53

题意:

求n个数抽任意数组成的集合满足里面都是平方数的个数。

题解:

分解质因数,列方程,求自由变元个数。

#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<queue>#include<map>#include<set>#include<stack>#include<string>#define B(x) (1<<(x))using namespace std;typedef long long ll;typedef unsigned long long ull;void cmax(int &a,int b){ if(b>a)a=b; }void cmin(int &a,int b){ if(b<a)a=b; }void cmax(ll &a,ll b){ if(b>a)a=b; }void cmin(ll &a,ll b){ if(b<a)a=b; }void add(int &a,int b,int mod){ a=(a+b)%mod; }void add(ll &a,ll b,ll mod){ a=(a+b)%mod; }void add(int &a,int b){ a+=b; }void add(ll &a,ll b){ a+=b; }const int oo=0x3f3f3f3f;const double eps = 1e-8;const ll MOD = 10007;const int maxn = 501;int maze[maxn][maxn];ll a[maxn];bool f[maxn];int p[maxn], cnt;void prime(){    cnt = 0;    memset(f, true, sizeof f);    for(int i = 2; i < maxn; i++){        if(!f[i]) continue;        p[cnt++] = i;        for(int j = i * i; j < maxn; j += i)            f[j] = false;    }}ll Gauss(int n, int m){    int r = 0, c = 0;    while(r < n && c < m){        int id = r;        for(int i = r + 1; i < n; i++)            if(maze[i][c] > maze[id][c])                id = i;        if(id != r){            for(int j = c; j <= m; j++)                swap(maze[id][j], maze[r][j]);        }        if(maze[r][c] != 0){            for(int i = r + 1; i < n; i++){                if(maze[i][c] == 0) continue;                for(int j = c; j <= m; j++)                    maze[i][j] ^= maze[r][j];            }            r++;        }        c++;    }    return (1LL << (m - r)) - 1;}int main(){    //freopen("E:\\read.txt", "r", stdin);    int n, m, u, v, T;    prime();    scanf("%d", &T);    while(T--){        scanf("%d", &m);        for(int i = 0; i < m; i++)            scanf("%lld", &a[i]);        n = 0;        memset(maze, 0, sizeof  maze);        for(int i = 0; i < cnt; i++){            for(int j = 0; j < m; j++){                while(a[j] % p[i] == 0){                    maze[i][j] ^= 1;                    a[j] /= p[i];                    cmax(n, i + 1);                }            }        }        printf("%lld\n", Gauss(n, m));    }    return 0;}



0 0
原创粉丝点击