首先说下高斯消元:就是把增广矩阵化成上三角矩阵的过程,然后来判断解的情况。设A*X = B.A是一个n*m的矩阵,X是m*1的解矩阵,B是n*1的系数矩阵。 那么增广矩阵就是一个n*(m+1)的矩阵。
增广矩阵高斯消元后有3种情况:1. 某行前m个数全为0但是最后一个数不为0,这样导出矛盾,所以原方程无解。2. 当m == n且最后一行的第m个数不为0时有唯一解。3. 其他情况有无限多解,比如最后一行前m个数不止一个数不为0时。
下面是1830怎么和高斯消元联系起来:
如果i的初始化状态和目标状态不同,那么b[i]=1. 因为b[i]
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include <algorithm>
#include<set>
#include<map>
#define LL long long
#define inf 0x7fffffff
#define linf 0x7fffffffffffffff
#define E 1e-9
#define M 100
#define N 32
using namespace std;
int n,k,m;
bool x[N];
bool ma[N][N];
int gauss()//n*(n+1)矩阵,化行阶梯形
{
int i=0,j=0;
for (; i<n,j<n;)
{
int k;
for(k=i; k<n; k++)
if(ma[k][j]!=0)
break;
if(k==n)
{
j++;
continue;
}
if(i!=k)
{
for(int l=j; l<=n; l++) //交换
swap(ma[i][l],ma[k][l]);
}
for(int r=i+1;r<n;r++)
if(ma[r][j])
{
for(int l=j;l<=n;l++)
ma[r][l]^=ma[i][l];//必须是异或
// ma[r][l]-=ma[i][l];
}
i++,j++;
}
for(int r=i;r<n;r++)
if(ma[r][n]!=0)
return 0;//无解
return (1<<(n-i));//因为解只能是0和1,所以最后剩了多少个变元,就有2的多少次方个解
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ex.in","r",stdin);
#endif
int T;
scanf("%d",&T);
while(T--)
{
memset(ma,0,sizeof(ma));
scanf("%d",&n);
for (int i=0; i<n; ++i )
scanf("%d",&x[i]);
for (int i=0; i<n; ++i )
{
scanf("%d",&ma[i][n]);
ma[i][n]^=x[i];
ma[i][i]=1;
}
int a,b;
while(scanf("%d%d",&a,&b)&&(a!=0||b!=0))
{
ma[b-1][a-1]=1;//方向
}
int num=gauss();
if(num)
printf("%d\n",num);
else
printf("Oh,it's impossible~!!\n");
}
}