UVA - 11542(求模2剩余系的矩阵的秩)

来源:互联网 发布:西部网络达人秀开场舞 编辑:程序博客网 时间:2024/06/09 16:56

由于本题的所有数的素数分解都比500小,可以用每个数的素数拆分后对应前五百素数的个数(个数记为m),组成矩阵中的一列共n列(每个素数的个数模2,因为最终结果要求所选元素乘积的值对应每个素数的的个数都应该是偶数),那么解向量是一个有01构成的(每个01代表对应的元素选与不选),右乘上述矩阵没使得结果为一个0(由个m零构成)列向量。

那么只需求m*n矩阵的秩,那么便可以知道自由变元的个数x,解就是2^x-1

下面为求解矩阵的秩的代码(在模2剩余系下)

const int N = 510;typedef int matrix[N][N];void inline Swap(matrix& A,int n,int i,int j){   rep(k,n) swap(A[i][k],A[j][k]);}int rank(matrix& A,int m,int n){   int lim=min(m,n);   int i=0,j=0;   while(i<m&&j<n){      int r=i;      for(int k=i;k<m;k++) if(A[k][j]){r=k; break;}      if(A[r][j]){         Swap(A,n,r,i);         for(int k=i+1;k<m;k++) if(A[k][j])            for(int l=j;l<n;l++) A[k][l]^=A[i][l];         i++;      }      j++;   }   return i;}

在说明一点,再求矩阵值的过程中不需要用增光矩阵,而是用系数矩阵就可以了。因为并不求解方程,而只是求解矩阵的秩。

该方法是化矩阵为阶梯形矩阵(

 (1) 若矩阵A有零行,则零行在非零行下方。

(2)各非零行的左起第一个元素的列序数从上到下严格递增。

0 0
原创粉丝点击