传送门:【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 ; }