题目链接

显然我们需要使每个i满足$$( ∑_{j} X[j]A[i][j] ) mod\ 2 = B[i]$$

求这个方程自由元Xi的个数ans,那么方案数便是\(2^{ans}\)

%2可以用^代替,不难看出 B[i]=st[i]^ed[i]

如果X[j]=1,假设j会影响i,那么X[j]
A[i][j]这一项应为1,所以A[i][j]应=1 输入别反!

注意A[i][i]=1

将系数矩阵化为上三角形式后,剩下的系数全为0的行数就是自由元的个数;

如果某一行系数全为零,增广矩阵最后一列对应行的值不为0,则无解

//硬是被输入反了坑了半天。。

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=31; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
struct Gauss
{
int n;
bool A[N][N];
void Init()
{
memset(A,0,sizeof A);
n=read();
for(int i=0; i<n; ++i) A[i][n]=read();
for(int i=0; i<n; ++i) A[i][n]^=read();
for(int i=0; i<n; ++i) A[i][i]=1;
int a,b;
while(a=read(),b=read(),a&&b) A[b-1][a-1]=1;//a,b别反!
}
void Solve()
{
int r=0,c=0;
while(r<n && c<n)
{
int mxrow=r;
for(int i=r+1; i<n; ++i)
if(A[i][c]>A[mxrow][c]) mxrow=i;
if(!A[mxrow][c]) {++c; continue;}
if(mxrow!=r) std::swap(A[r],A[mxrow]);
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, ++c;
}//从r往后的行的矩阵元素都为0
for(int i=r; i<n; ++i)//某一行系数全为0但最后一列不为0
if(A[i][n]) {puts("Oh,it's impossible~!!"); return;}
printf("%d\n",1<<(n-r));
}
}g; int main()
{
int t=read();
while(t--) g.Init(), g.Solve();
return 0;
}

POJ.1830.开关问题(高斯消元 异或方程组)的更多相关文章

  1. POJ 1830 开关问题 高斯消元,自由变量个数

    http://poj.org/problem?id=1830 如果开关s1操作一次,则会有s1(记住自己也会变).和s1连接的开关都会做一次操作. 那么设矩阵a[i][j]表示按下了开关j,开关i会被 ...

  2. POJ 1830 开关问题 (高斯消元)

    题目链接 题意:中文题,和上篇博客POJ 1222是一类题. 题解:如果有解,解的个数便是2^(自由变元个数),因为每个变元都有两种选择. 代码: #include <iostream> ...

  3. POJ 1830 开关问题 [高斯消元XOR]

    和上两题一样 Input 输入第一行有一个数K,表示以下有K组测试数据. 每组测试数据的格式如下: 第一行 一个数N(0 < N < 29) 第二行 N个0或者1的数,表示开始时N个开关状 ...

  4. BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)

    题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...

  5. UVA11542 Square(高斯消元 异或方程组)

    建立方程组消元,结果为2 ^(自由变元的个数) - 1 采用高斯消元求矩阵的秩 方法一: #include<cstdio> #include<iostream> #includ ...

  6. Tsinsen-A1488 : 魔法波【高斯消元+异或方程组】

    高斯消元. 自己只能想出来把每一个点看成一个变量,用Xi表示其状态,这样必定TLE,n^2 个变量,再加上3次方的高斯消元(当然,可以用bitset压位). 正解如下: 我们把地图划分成一个个的横条和 ...

  7. UVa 11542 (高斯消元 异或方程组) Square

    书上分析的太清楚,我都懒得写题解了.=_=|| #include <cstdio> #include <cstring> #include <cmath> #inc ...

  8. UVA 11542 Square 高斯消元 异或方程组求解

    题目链接:点击打开链接 白书的例题练练手. . . P161 #include <cstdio> #include <iostream> #include <algori ...

  9. poj1830(高斯消元解mod2方程组)

    题目链接:http://poj.org/problem?id=1830 题意:中文题诶- 思路:高斯消元解 mod2 方程组 有 n 个变元,根据给出的条件列 n 个方程组,初始状态和终止状态不同的位 ...

随机推荐

  1. caffe-win10-cifar10

    因为是在win10下安装的GPU版caffe,所以不能直接运行linux里的shell脚本.但是win10自带bash,可以运行.sh文件,网上也有直接下Cygwin和git的.我是下载好git后才知 ...

  2. error: Apache shutdown unexpectedly.

    本地前端xmapp apache突然不能启动了, 报错 15:36:48 [Apache] Error: Apache shutdown unexpectedly.15:36:48 [Apache] ...

  3. tomcat下部署应用helloworld

    部署应用(简单)1.到Tomcat的安装目录的webapps目录,可以看到ROOT,examples, tomcat-docs之类Tomcat自带的的目录.2.在webapps目录下新建一个目录mya ...

  4. Oracle数据库操作基本语法

    创建表 SQL>create table classes(        classId number(2),        cname varchar2(40),        birthda ...

  5. LeetCode(64):最小路径和

    Medium! 题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [   [1 ...

  6. WPF 绑定 验证

    <TextBox Grid.Column="1" Margin="1" Text="{Binding Name, ValidatesOnExce ...

  7. STL整理之set

    转载请注明出处,部分内容引自李煜东<算法竞赛进阶指南> 前置知识:    C++.C语言入门 Set是什么 Set是C++STL中提供的容器,set是数学上的集合——具有唯一性,即每个元素 ...

  8. pytest一:pytest 框架介绍

    pytest 是 python 的一种单元测试框架,与python 自带的 unittest测试框架类似,但是比 unittest 框架使用起来更简洁,效率更高.根据pytest 的官方网站介绍,它具 ...

  9. java远程工具类

    package com.zdz.httpclient; import java.io.BufferedReader; import java.io.IOException; import java.i ...

  10. 步步为营-10-string的简单操作

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...