题目链接

显然我们需要使每个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. Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法与解析【转】

    转自:http://blog.csdn.net/hzn407487204/article/details/7995041 在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设 ...

  2. gdb revert, Go to previous line in gdb

    Yes! With the new version 7.0 gdb, you can do exactly that! The command would be "reverse-step& ...

  3. 使用python命令构建最简单的web服务

    可以使用python自带的包建立最简单的web服务器,使用方法: 1)切换到服务器的根目录下 2)输入命令: python -m SimpleHTTPServer 3)使用wget或者在浏览器访问测试 ...

  4. python httplib和urllib的性能比较

    httplib代码: urlParseResult = urlparse(url) host = urlParseResult.hostname path = urlParseResult.path ...

  5. XPATH语法(一)

    Xpath简介 XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点 ...

  6. 【python】logging记录traceback

    import logging try: do-something-block except: logging.exception("Exception Logged")

  7. VIM vim/vi的文件内、跨文件复制粘贴操作、替换操作

    https://www.cnblogs.com/shengulong/p/6702868.html vi/vim 中可以使用 :s 命令来替换字符串 1.s/vivian/sky/ 替换当前行第一个 ...

  8. WCF简介-01

    WCF Windows Communication Foundation 1.1 新建一个"空白解决方案" 1.2 在解决方案中添加类库IBLL 1.2.1 添加接口IUserIn ...

  9. Chakra GC内存管理(未完)

    这一部分是我在网上找Chakra资料的时候偶然发现的zenhumany师傅在Hitcon2015上的议题<Microsoft Edge MemGC Internals>,感觉正好可以了解一 ...

  10. 去掉m3u8的片头和片尾

    # pip3 install -i https://mirrors.aliyun.com/pypi/simple/ m3u8 # pip3 install -i https://mirrors.ali ...