传送门:【HDU】3915 Game
题目分析:对每一位列方程,高斯消元求出自由元个数,解就是2^自由元个数%1000007。(-1纯属扯淡,所有的都取完不就是一种了吗= 、=)
bitset初次使用>.<我个人觉得本题一位一个方程还是一个数一个方程效果一样,因为矩阵的秩不变,按位列方程是考虑到方程组的意义,而一个数一个方程,高斯消元的过程反而更像数之间的异或,怎样理解好就怎样理解吧~
代码如下:
#include <bitset>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std ;
#define rep( i , a , b ) for ( int i = ( a ) ; i < ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define clr( a , x ) memset ( a , x , sizeof a )
bitset < 105 > a[31] ;
void gauss ( int equ , int var ) {
int r , c , tmp_r ;
for ( r = c = 0 ; r < equ && c < var ; ++ r , ++ c ) {
tmp_r = r ;
for ( ; tmp_r < equ ; ++ tmp_r ) if ( a[tmp_r][c] ) break ;
if ( tmp_r == equ ) {
-- r ;
continue ;
} else swap ( a[tmp_r] , a[r] ) ;
rep ( i , r + 1 , equ ) if ( a[i][c] ) a[i] ^= a[r] ;
}
int n = var - r , ans = 1 ;
rep ( i , 0 , n ) {
ans <<= 1 ;
if ( ans >= 1000007 ) ans -= 1000007 ;
}
printf ( "%d\n" , ans ) ;
}
void solve () {
int x , n ;
rep ( i , 0 , 31 ) a[i] = 0 ;
scanf ( "%d" , &n ) ;
rep ( i , 0 , n ) {
scanf ( "%d" , &x ) ;
rep ( j , 0 , 31 ) a[j][i] = ( x >> j ) & 1 ;
}
gauss ( 31 , n ) ;
}
int main () {
int T ;
scanf ( "%d" , &T ) ;
while ( T -- ) solve () ;
return 0 ;
}