【HDU】3915 Game 高斯消元求自由元个数

传送门:【HDU】3915 Game


题目分析:对每一位列方程,高斯消元求出自由元个数,解就是2^自由元个数%1000007。(-1纯属扯淡,所有的都取完不就是一种了吗= 、=)

bitset初次使用>.<我个人觉得本题一位一个方程还是一个数一个方程效果一样,因为矩阵的秩不变,按位列方程是考虑到方程组的意义,而一个数一个方程,高斯消元的过程反而更像数之间的异或,怎样理解好就怎样理解吧~


代码如下:


#include 
#include 
#include 
#include 
#include 
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 ;
}


你可能感兴趣的:(数学)