AcWing 884. 高斯消元解异或线性方程组
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 884. 高斯消元解异或线性方程组相关的知识,希望对你有一定的参考价值。
题目连接
https://www.acwing.com/problem/content/886/
思路
和浮点高斯消元类似的,步骤也是相同的,不过我们这里的运算操作变成了异或操作,对于我们枚举到的第r行,第c列我们希望能将下面[r+1,n)行的第c位全部置为0,其实这和普通的高斯消元并无两样
代码
#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
int dx[4] = -1, 0, 1, 0, dy[4] = 0, 1, 0, -1;
ll ksm(ll a,ll b)
ll ans = 1;
for(;b;b>>=1LL)
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
return ans;
ll lowbit(ll x)return -x & x;
const int N = 1e2+10;
//----------------自定义部分----------------
int t,n,m,q,a[N][N];
int guss()
int c,r;
for(c=0,r=0;c <= n; ++c)
int t = r;
for(int i = r;i < n; ++i)//找到一个不为0的行
if(a[i][c])
t = i;
break;
if(!a[t][c]) continue;
for(int i = 0;i <= n; ++i) swap(a[t][i],a[r][i]);
for(int i = r + 1;i < n; ++i) //消元
if(a[i][c])
for(int j = c;j <= n; ++j)
a[i][j] ^= a[r][j];
r++;
if(r < n)
for(int i = r;i < n; ++i)
if(a[i][n]) return 1;
return 2;
for(int i = n-1;i >= 0; --i)
for(int j = i + 1;j < n; ++j)
a[i][n] ^= a[i][j] * a[j][n];
return 0;
void slove()
cin>>n;
for(int i = 0;i < n; ++i)
for(int j = 0;j <= n; ++j)
cin>>a[i][j];
int t = guss();
if(t == 1) puts("No solution");
else if(t == 2) puts("Multiple sets of solutions");
else
for(int i = 0;i < n; ++i) cout<<a[i][n]<<endl;
int main()
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
t = 1;
while(t--)
slove();
return 0;
以上是关于AcWing 884. 高斯消元解异或线性方程组的主要内容,如果未能解决你的问题,请参考以下文章
bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)