高斯消元异或模板
int equ, var;///equ個方程 var個變量
int a[maxn][maxn];///增廣矩陣
int x[maxn];///解集
int x_i[maxn];
bool free_x[maxn];///判斷是不是自由變元
int free_num;///自由變元的個數
int Gauss()
{int Max_r;///當前列絕對值最大的存在的行///col:處理當前的列int row,col = 0;int free_x_num;int free_index;free_num = 0;for(int i=0; i<=var; i++){x[i] = 0;free_x[i] = 1;}for(row=0; row<equ&&col<var; row++,col++){Max_r = row;for(int i=row+1; i<equ; i++)if(abs(a[i][col]) > abs(a[Max_r][col]))Max_r = i;if(a[Max_r][col] == 0){free_x[col] = 1;x_i[free_num++] = col;row--;continue;}if(Max_r != row)for(int i=col; i<var+1; i++)swap(a[row][i], a[Max_r][i]);///消元for(int i=row+1; i<equ; i++)if(a[i][col])for(int j=col; j<var+1; j++)a[i][j] ^= a[row][j];}for(int i=row; i<equ; i++)if(a[i][col])return -1;///無解///保證對角線主元非 0for(int i=0; i<equ; i++){if(!a[i][i]){int j;for(j=i+1; j<var; j++)if(a[i][j])break;if(j == var)break;for(int k=0; k<equ; k++)swap(a[k][i], a[k][j]);}}if(row < var)return var - row;///自由變元的個數///回代,得到解集for(int i=var-1; i>=0; i--){x[i] = a[i][var];for(int j=i+1; j<var; j++)x[i] ^= (a[i][j] && x[j]);}return 0;///唯一解
}
總結