题目链接

显然我们需要使每个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. 使用光盘搭建本地yum源

    刚装好的系统,想安装一些常用软件和一些包组的时候,就可以使用安装光盘搭建本地yum 第一步:挂载安装光盘 mount /dev/cdrom /mnt 第二步:编辑repo yum源文件 [root@l ...

  2. 前端实现商品sku属性选择

    一.效果图 二.后台返回的数据格式 [{ "saleName": "颜色", "dim": 1, "saleAttrList&qu ...

  3. Android OAuth认证

    OAuth认证 为了安全地访问在线服务,用户需要在服务上进行身份验证,即要提供他们的身份的证明.对于一个要访问第三方服务的程序来说,安全问题甚至更复杂.不仅仅是用户需要在访问服务前要进行身份验证,而且 ...

  4. Linux常用命令3(压缩和解压缩总结)

    tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...

  5. VirtualBox上的Ubuntu附加功能

    主机:Windows 10家庭中文版,VirtualBox 版本 5.2.22 r126460 (Qt5.6.2),Ubuntu 18.04, 在主机上安装了VirtualBox,然后在Virtual ...

  6. Python-CSS 基础

    css入门 一.架构分析 页面 => div的层级结构 => 具有采用哪些功能标签显示内容 结构层 > 位置层(布局层) > 内容层 二.css引入 - 行间式 <div ...

  7. python之鸭子类型

    python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型. 在程序设计中,鸭子类型是动态类型的一种风格,不是由继承特定的类或实现特定的接口,而是当前的方法和属性的集合决定,鸭子 ...

  8. 对字符串进行频繁拼接的话,使用StringBuffer或者StringBuilder

    package zhengze; /*如果需要对字符串进行频繁拼接的话,使用StringBuffer或者StringBuilder StringBuffer:[字符串缓冲器]是线程安全的,效率低 St ...

  9. 在django中使用FormView,success_url死活不能生效的问题

    真的不知道是怎么回事, 以前都是手动的, form使用modelform. view使用createview. 今天写新系统时,为了更灵活. form使用form,(这样一来,可以在form是随便按数 ...

  10. 行为型模式之Command模式

    命令模式将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化, 并且可以对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 概念描述 把命令的调用者与执行者分开,使双方不必关心对方是 ...