【POJ 1830】 开关问题】的更多相关文章

思路:乍一看好像和线性代数没什么关系.我们用一个数组B表示第i个位置的灯变了没有,然后假设我用u[i] = 1表示动开关i,mp[i][j] = 1表示动了i之后j也会跟着动,那么第i个开关的最终状态为:u[1]*mp[1][i]^u[2]*mp[2][i]....^u[n]*mp[n][i](或者改为相加 % 2).显然,前式等于B[i],所以,问题转化为了求u的解个数:MP*U = B.注意MP矩阵的写法. 关于矩阵: r(A) = r(A,b)           有解 r(A) = r(…
任意门:http://poj.org/problem?id=1830 开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10742 Accepted: 4314 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开…
开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8714   Accepted: 3424 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作…
http://poj.org/problem?id=1830 如果开关s1操作一次,则会有s1(记住自己也会变).和s1连接的开关都会做一次操作. 那么设矩阵a[i][j]表示按下了开关j,开关i会被操作一次,记得a[i][i] = 1是必须的,因为开关i操作一次,本身肯定会变化一次. 所以有n个开关,就有n条方程, 每个开关的操作次数总和是:a[i][1] + a[i][2] + ... + a[i][n] 那么sum % 2就代表它的状态,需要和(en[i] - be[i] + 2) % 2…
开关问题 题意:给n(0 < n < 29)开关的初始和最终状态(01表示),以及开关之间的关联关系(关联关系是单向的输入a b表示a->b),问有几种方式得到最终的状态.否则输出字符字面值. 1.与poj 1222的区别:关联为单向,需要预处理出每个开关对自己的关联(开始在输入关联关系中处理自身的关联,WA了两发),操作的矩阵(变换的矩阵)为初始状态XOR最终状态: 2.处理完之后判断系数全为0的最终结果a[k][var]是否为0来判断是否无解.同时如有n个自由变元,由于每个变元只有两…
开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7726   Accepted: 3032 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作…
题目链接 题意:中文题,和上篇博客POJ 1222是一类题. 题解:如果有解,解的个数便是2^(自由变元个数),因为每个变元都有两种选择. 代码: #include <iostream> #include <cmath> #include <cstring> #include <cstdio> using namespace std; ],e[],g[][],n; int gauss() { int row,col; ,col=;row<n&&…
题目链接 Solutin: 将每个开关使用的情况当成未知数,如果开关i能影响到开关j,那么系数矩阵A[j][i]的系数为1. 每个开关增广矩阵的值是开关k的初状态异或开关k的目标状态,这个应该很容易想到. 方程都列好了,直接消元就好了. code /* 解异或方程组 */ #include <iostream> #include <cstring> using namespace std; ; int prim[MAXN]; int A[MAXN][MAXN]; int Gauss…
和上两题一样 Input 输入第一行有一个数K,表示以下有K组测试数据. 每组测试数据的格式如下: 第一行 一个数N(0 < N < 29) 第二行 N个0或者1的数,表示开始时N个开关状态. 第三行 N个0或者1的数,表示操作结束后N个开关的状态. 接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化.每组数据以 0 0 结束.  注意判断无解别把if放错位置 我的now表示当前该哪个方程组了,一开始是1确定一个变量就+1,答案应该是$2^{n-now+1}$才行…
题目链接 显然我们需要使每个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的行数就是自由元的个数: 如果某一行系数全为零,增广矩阵最后一列对应…
http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http://poj.org/problem?id=1753 http://poj.org/problem?id=3185 这几个题目都类似,都可以使用高斯消元来求解一个模2的01方程组来解决. 有时候需要枚举自由变元,有的是判断存不存在解 POJ 1222 EXTENDED LIGHTS OUT 普通的问题.…
开关问题   Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作.你的任务是,计算有多少种可以达到指定状态的方法.(不计开关操作的顺序) Input 输入第一行有一个数K,表示以下有K组测试数据. 每组测试数据的格式如下: 第…
http://poj.org/problem?id=1830 高斯消元无解的条件:当存在非法的左式=0而右式不等于0的情况,即为非法.这个可以在消元后,对没有使用过的方程验证是否右式不等于0(此时因为前边消元一定会使得后边的方程左式为0) 高斯消元自由变元:自由变元就是当这些未知量一旦确定,整个方程就确定了.但是这些量是未知的.(例如x+y=5,自由变元就是1,因为无论是x还是y确定,另一个就能唯一确定),而答案要求的是方案,那么显然因为自由变元是可以随便赋值的,而这些值只有2个,开和不开,那么…
[题目链接] http://poj.org/problem?id=1830 [算法] 列出异或方程组,用高斯消元求解 [代码] #include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio…
pro:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作.你的任务是,计算有多少种可以达到指定状态的方法.(不计开关操作的顺序) sol:即求自由元的个数,答案是pow(2,自由元). #include<bits/stdc++.h> #defin…
开关问题 Problem's Link: http://poj.org/problem?id=1830 Mean: 略 analyse: 增广矩阵:con[i][j]:若操作j,i的状态改变则con[i][j]=1,否则con[i][j]=0. 最后的增广矩阵应该是N*(N+1),最后一列:对比开光的始末状态,若相同则为0,若不同则为1: 最后的解共有三种:1.无解,既出现了一行中前面N个数为0,第N+1的值非0:2.没有第1种情况出现,存在X行数值全为0,则解的个数为2^X;3,没有1,2 两…
题目链接: http://poj.org/problem?id=1681 题目大意:一堆格子,或白或黄.每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变.问最后使格子全部变黄,最少需要改变几个格子. 解题思路: 与POJ 1222类似. 一共只有15*15个格子,设初始解向量黄为0,白为1. 对于每个开关,设其改变状态为x5,上下左右四个开关改变状态分别为x1,x2,x3,x4, 那么有方程x1^x2^x3^x4^x5^初始状态=0. 这样就有15*15个方程.解这15*15个线性方…
题目链接: http://poj.org/problem?id=1222 题目大意:一堆开关,或开或关.每个开关按下后,周围4个方向开关反转.问使最后所有开关都关闭的,开关按法.0表示不按,1表示按. 解题思路: 一共只有5*6个开关. 对于每个开关,设其最终状态为x5,上下左右四个开关最终状态分别为x1,x2,x3,x4, 那么有方程x1^x2^x3^x4^x5^初始状态=0. 这样就有30个方程.解这30个线性方程组即可. 用高斯消元法来解方程组,变化如下: ①对于原本找列中绝对值最大这一步…
开关问题   Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作.你的任务是,计算有多少种可以达到指定状态的方法.(不计开关操作的顺序) Input 输入第一行有一个数K,表示以下有K组测试数据. 每组测试数据的格式如下: 第…
题目链接: http://poj.org/problem?id=1753 题目大意:一堆格子,或白或白.每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变.问最后使格子全部白或全部黑,求最小改变的格子树. 解题思路: 与POJ 1681 类似.不过这次是或黑或白,要初始化两次相反的解向量, 进行两次高斯消元,取其中小的值. 特殊的是,本题中有自由变元的存在,也就是说这个格子可黑可白,对结果没有影响. 这时候就会存在无穷解.其实POJ 1681也可能存在自由变元,不过数据略水,没处理也能…
题目链接: http://poj.org/problem?id=3276 题目大意:有一些牛,头要么朝前要么朝后,现在要求确定一个连续反转牛头的区间K,使得所有牛都朝前,且反转次数m尽可能小. 解题思路: 首先不要看错题意了,不是求最小K,不要二分.而且反转区间长度一定是K,小于K是不能反转的. 很明显得枚举K(1...n),并且有以下反转思路: ①从第一头牛开始,如果朝前,不管了.看下一头牛,如果朝后反转K长度区间.....一直扫到区间结束. ②第一趟结束后,如果不符合要求,继续重复①,直到所…
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5418 Accepted: 2022 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作.你的任…
首先...使用abs()等数学函数的时候,浮点数用#include<cmath>,其它用#include<cstdlib>. 概念: [矩阵的秩] 在线性代数中,一个矩阵A的列秩是A的线性无关的纵列的极大数目.类似地,行秩是A的线性无关的横行的极大数目. 此题如果有解,解的个数便是2^(自由变元个数),因为每个变元都有两种选择,既1 << n 对于r以下的行,必定全是0,那么如果a[i][n]!=0 必然出现矛盾,于是判定无解. #include <iostrea…
传送门:Problem 3279 #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define mem(a,b) (memset(a,b,sizeof a)) +; int m,n; int tile[maxn][maxn]; int f[maxn][maxn]; int res[maxn][maxn]; int times; bool isWhite(int x,i…
转载自:http://hi.baidu.com/czyuan_acm/item/dce4e6f8a8c45f13d7ff8cda czyuan 先上模板: /* 用于求整数解得方程组. */ #include <iostream> #include <string> #include <cmath> using namespace std; ; int equ, var; // 有equ个方程,var个变元.增广阵行数为equ, 分别为0到equ - 1,列数为var…
题意:有n个灯笼,m个开关 每个开关可以控制k个灯笼, 然后分别列出控制的灯笼的编号(灯笼编号为1到n) 下面有Q个询问,每个询问会有一个最终状态(n个灯笼为一个状态)0代表关 1代表开 问到达这种状态,按开关的方法总数 解释一下案例: 3 2     (有3个灯笼, 2个开关) 2 1 2  (第一个开关控制2个灯笼,这两个灯笼的编号是1.2) 2 1 3  (第一个开关控制2个灯笼,这两个灯笼的编号是1.3) 2        (2个询问) 0 1 1  (这3个灯笼变为关.开.开 有几种按…
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组.所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解. 以上是线性代数课的回顾,下面来说说高斯消元法在编程中的应用. 首先,先介绍程序中高斯消元法的步骤:(我们设方程组中方程的个数为equ,变元的个数为var,注意:一般情况下是n个方程,n个变元,但是有些题目就故意让方程数与变元数…
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. 所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解. 1.线性方程组 1)构造增广矩阵,即系数矩阵A增加上常数向量b(A|b) 2)通过以交换行.某行乘以非负常数和两行相加这三种初等变化将原系统转化为更简单的三角形式(triangular form) 注:这里的初等变化可以通过…
目录 笔记整理 计划 要学的东西 缺省源 要做的题 搜索 高斯消元 矩阵 排列组合 2019.7.9 2019.7.10 kmp ac自动机 2019.7.11 2019.7.15 笔记整理 1.同余and乘法逆元学习笔记 2.排列组合学习笔记 3.字符串Hash学习笔记 4.树状数组学习笔记 5.线段树学习笔记 6.ST表学习笔记 7.树形DP学习笔记 8.位运算学习笔记 9.二分答案学习笔记 还没写 ,咕咕咕 10.区间dp学习笔记 待更新例题 11.背包问题 12.STL学习笔记 13.字…
扣了一个高斯的介绍 比较全面(来自http://blog.csdn.net/duanxian0621/article/details/7408887) 高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组.所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解. 以上是线性代数课的回顾,下面来说说高斯消元法在编程中的应用. 首先,先介绍…