884. 高斯消元解异或线性方程组
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了884. 高斯消元解异或线性方程组相关的知识,希望对你有一定的参考价值。
https://www.acwing.com/problem/content/886/
高斯消元的步骤分为以下几步:
- 枚举每一行找到当前行(包括当前行)下面的,当前列为1的一行。
- 将其找到的这一行移到上面
- 将下面所有的行的当前列都异或成0
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e2+10;
int a[N][N];
int n;
int gauss()
{
int c=1,r=1;
for(c=1,r=1;c<=n;c++)
{
int t=r;
for(int i=r;i<=n;i++)//1 一个当前列非零的行找到
{
if(a[i][c])
{
t=i;
break;
}
}
if(!a[t][c]) continue;
for(int i=c;i<=n+1;i++) swap(a[r][i],a[t][i]);//交换
for(int i=r+1;i<=n;i++) //化简
{
if(a[i][c])
for(int j=n+1;j>=c;j--)
{
a[i][j]=a[i][j]^a[r][j];
}
}
r++;
}
if(r<=n)
{
for(int i=r;i<=n;i++)
{
if(a[i][n+1]) return 0;
}
return 1;
}
for(int i=n;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
{
a[i][n+1]^=a[j][n+1]*a[i][j];
}
}
return 2;
}
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
cin>>a[i][j];
int t=gauss();
if(t==0) cout<<"No solution"<<endl;
else if(t==1) cout<<"Multiple sets of solutions"<<endl;
else {
for(int i=1;i<=n;i++) cout<<a[i][n+1]<<endl;
}
return 0;
}
以上是关于884. 高斯消元解异或线性方程组的主要内容,如果未能解决你的问题,请参考以下文章
bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)