朴素版高斯消元
int gauss(int n , int a[N][N] , vector<int>& ans){
for(int c = 1 ; c <= n ; c ++){
int t = c ; //找1位置
for(int r = c + 1 ; r <= n ; r ++)
if(a[r][c])
t = r ;
if(!a[t][c]) continue ; //无系数 , 可填0/1
for(int i = c ; i <= n + 1 ; i ++)
swap(a[c][i] , a[t][i]) ;
for(int i = 1 ; i <= n ; i ++){
if(i != c && a[i][c]){
for(int j = c ; j <= n + 1 ; j ++)
a[i][j] ^= a[c][j] ;
}
}
}
for(int i = 1 ; i <= n ; i ++){
if(a[i][i]){
ans.push_back(a[i][n + 1]) ;
}
else if(a[i][n + 1]) return 2 ; //无解
else return 3 ; //多解
}
return 1 ;
}
bitset优化版
int gauss(int n , bitset<N> a[N] , vector<int>& ans){
for(int c = 1 ; c <= n ; c ++){
int t = c ; //找1位置
for(int r = c + 1 ; r <= n ; r ++)
if(a[r][c])
t = r ;
if(!a[t][c]) continue ; //无系数 , 可填0/1
swap(a[c] , a[t]) ;
for(int i = 1 ; i <= n ; i ++){
if(i != c && a[i][c]){
a[i] ^= a[c] ;
}
}
}
for(int i = 1 ; i <= n ; i ++){
if(a[i][i]){
ans.push_back(a[i][n + 1]) ;
}
else if(a[i][n + 1]) return 2 ; //无解
else return 3 ; //多解
}
return 1 ;
}