版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Game_Acm/article/details/82081561
const int maxn = 110;
const int mod = 2;
int a[maxn][maxn],x[maxn],free_x[maxn],free_num;
int Qpow( int a , int b )
{
int res = 1;
while ( b )
{
if ( b&1 )
res = res*a%mod;
a = a*a%mod;
b = b>>1;
}
return res;
}
int Gauss( int equ , int var )
{
int max_r,col,k;
free_num = 0;
for ( k=0,col=0 ; k<equ&&col<var ; k++,col++ )
{
max_r = k;
for ( int i=k+1 ; i<equ ; i++ )
if ( Abs( a[i][col] )>Abs( a[max_r][col] ) )
max_r = i;
if ( a[max_r][col]==0 )
{
k--;
free_x[free_num] = col;
continue;
}
if ( max_r!=k )
for ( int j=col ; j<var+1 ; j++ )
swap ( a[k][j] , a[max_r][j] );
for ( int i=k+1 ; i<equ ; i++ )
if ( a[i][col]!=0 )
{
int LCM = Lcm( Abs( a[i][col] ) , Abs( a[k][col] ) );
int ta = LCM/Abs( a[i][col] );
int tb = LCM/Abs( a[k][col] );
if ( a[i][col]*a[k][col]<0 )
tb = -tb;
for ( int j=col ; j<var+1 ; j++ )
a[i][j] = ( ( a[i][j]*ta-a[k][j]*tb )%mod+mod )%mod;
}
}
for ( int i=k ; i<equ ; i++ )
if ( a[i][col]!=0 ) return -1;
if ( k<var ) return var-k;
for ( int i=var-1 ; i>=0 ; i-- )
{
x[i] = a[i][var];
for ( int j=i+1 ; j<var ; j++ )
if ( a[i][j] )
x[i] = ( ( x[i]-a[i][j]*x[j] )%mod+mod )%mod;
x[i] = x[i]*Qpow( a[i][i] , mod-2 )%mod;
}
return 0;
}