POJ 1830 开关问题 【01矩阵 高斯消元】

POJ 1830 开关问题(高斯消元) 传送门 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺... 阅读详情

任意门:http://poj.org/problem?id=1830

开关问题

Time Limit: 1000MS

 

Memory Limit: 30000K

Total Submissions: 10742

 

Accepted: 4314

Description

有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)

Input

输入第一行有一个数K,表示以下有K组测试数据。 
每组测试数据的格式如下: 
第一行 一个数N(0 < N < 29) 
第二行 N个0或者1的数,表示开始时N个开关状态。 
第三行 N个0或者1的数,表示操作结束后N个开关的状态。 
接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。 

Output

如果有可行方法,输出总数,否则输出“Oh,it's impossible~!!” 不包括引号

Sample Input

2
3
0 0 0
1 1 1
1 2
1 3
2 1
2 3
3 1
3 2
0 0
3
0 0 0
1 0 1
1 2
2 1
0 0

Sample Output

4
Oh,it's impossible~!!

Hint

第一组数据的说明: 
一共以下四种方法: 
操作开关1 
操作开关2 
操作开关3 
操作开关1、2、3 (不记顺序) 

 

题意概括:

如题。

解题思路:

根据开关之间的关系可以构造一个0,1矩阵,然后通过求解这个矩阵,相加模2(即异或操作),求解线性方程组。

一个自由元即产生 2 种可能性,假设最后解的方程组存在ans个自由元 ,方案数就是 2 的 ans 次幂;

如何构造这样一个0,1增广矩阵呢?

设方程个数为 equ 个, 未知数个数为 var 个,我们最终构造出来的是一个 equ*(var+1)的0,1矩阵。 

最后一列 a [ i ][ var + 1 ] 很容易 就是 初始状态 st [ i ] ^ 最终状态 ed [ i ];

而前面的系数矩阵呢?

其实是一个 N*N 的矩阵,可以把开关之间的关系理解成图的边,这个系数矩阵就是这个图的邻接矩阵。

 

构造出了增广矩阵,接下来的就是交给高斯消元去求解这个方程组了。

 

Ac code:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <map>
 7 #define LL long long
 8 #define INF 0x3f3f3f3f
 9 using namespace std;
10 const int MAXN = 35;
11 int N, cnt;
12 
13 int a[MAXN][MAXN];      //增广矩阵
14 int x[MAXN];            //解集
15 bool freeX[MAXN];       //标记自由元
16 int free_num;           //自由元个数
17 int st[MAXN];           //记录初始状态
18 int ed[MAXN];           //记录最终状态
19 
20 int Gauss(int equ, int var)
21 {
22     int maxRow, col, k;
23     free_num = 0;
24     for(k = 0, col = 0; k < equ && col < var; k++, col++){
25         maxRow = k;
26         for(int i = k+1; i < equ; i++){                     //寻找当前列绝对值最大的一行
27             if(abs(a[i][col]) > abs(a[maxRow][col])){
28                 maxRow = i;
29             }
30         }
31         if(a[maxRow][col] == 0){                //表示当前列绝对值最大的已经是0了,说明该列下面的全部都是0
32             k--;
33             freeX[free_num++] = col;
34             continue;
35         }
36         if(maxRow != k){                       //绝对值最大的一行与当前行交换
37             for(int j = col; j < var+1; j++){
38                 swap(a[k][j] , a[maxRow][j]);
39             }
40         }
41         for(int i = k+1; i < equ; i++){         //以绝对值最大的一行为标准对其他行进行消元
42             if(a[i][col] != 0){
43                 for(int j = col; j < var+1; j++){
44                     a[i][j] ^= a[k][j];
45                 }
46             }
47         }
48     }
49     for(int i = k; i < equ; i++)        //判断是否无解
50         if(a[i][col] != 0)
51         return -1;
52 
53     if(k < var){
54         return var-k;   //自由元的个数
55     }
56     //唯一解,回代
57     for(int i = var-1; i >= 0; i--){
58         x[i] = a[i][var];
59         for(int j = i+1; j < var; j++){
60             x[i] ^= (a[i][j] && x[j]);
61         }
62     }
63     return 0;
64 }
65 
66 int main()
67 {
68     int T_case;
69     int u, v;
70     scanf("%d", &T_case);
71     while(T_case--){
72         scanf("%d", &N);
73         for(int i = 0; i < N; i++){
74             scanf("%d", &st[i]);
75         }
76         for(int i = 0; i < N; i++){
77             scanf("%d", &ed[i]);
78         }
79         memset(a, 0, sizeof(a));
80         memset(x, 0, sizeof(x));
81                                                         //构造增广矩阵
82         for(int i = 0; i < N; i++){                     //本开关肯定对本开关有影响
83             a[i][i] = 1;
84         }
85 
86         while(~scanf("%d%d", &u, &v) && (u+v)){         //构造对除自身外开关的影响,自身是系数也是未知量
87             a[v-1][u-1] = 1;
88         }
89         for(int i = 0; i < N; i++){                     //结果
90             a[i][N] = st[i]^ed[i];                      //这里异或相当于对2取模运算
91         }
92         int ans = Gauss(N, N);
93         if(ans == -1) printf("Oh,it's impossible~!!\n");    //无解
94         else printf("%d\n", 1<<ans);                        //2的ans次方,因为有ans个自由元
95     }
96     return 0;
97 }
View Code

 

ModelSim 2020.4破解失败?手把手教你解决‘Unable to checkout viewer license‘报错(附环境变量配置) 本文针对ModelSim 2020.4启动时遇到的‘Unable to checkout viewer license’报错,提供了从理解许可证机制到分步修复的完整指南。文章深入解析了viewer license与图形用户界面(GUI)的关系,并详细说明了通过生成有效许可证文件、精准配置系统环境变量及替换关键文件来解决图形界面启动失败的问题,帮助用户彻底修复并理解其背后的逻辑。 阅读详情

相关推荐

本地AI代码助手:智能解析大型代码库,实现自动化重构与理解

在软件开发中,大型代码库的理解与维护是常见挑战。传统方法依赖人工阅读和有限上下文工具,效率低下。通过结合检索增强生成(RAG)和多智能体(Multi-Agent)架构,现代AI工具能够智能解析代码结构,理解模块关系,并精准定位相关代码片段。这种技术不仅能提升代码探索效率,还能自动化执行重构、文档生成等任务,在遗留系统维护、快速上手新项目等场景中发挥关键作用。本文以blackboxaicode/cli为例,展示了如何利用其代码感知和Workflow Automation能力,高效处理复杂代码库。

weixin_30240349的博客 369

First Knight UVA - 12177 (高斯消元)

题意:给出每个点向四方走的概率,保证和为1,并且向边界外走的概率为0,求从(0, 0)走到(n-1, m-1)的期望步数。 题解:dp[i][j] 表示从 (i,j)走到终点的期望步数, 然后列n * m 个方程, 用高斯消元求解。 注意精度问题,求解过程中可以构成一个下三角形式,然后直接得到在(0, 0)位置的期望步数,可以减少很多误差,并且eps需要开到1e-12。 因为这是一个稀疏矩阵...

FIVE 561

机器学习系列(1)_逻辑回归初步

1、总述 逻辑回归是应用非常广泛的一个分类机器学习算法,它将数据拟合到一个logit函数(或者叫做logistic函数)中,从而能够完成对事件发生的概率进行预测。 2、由来     要说逻辑回归,我们得追溯到线性回归,想必大家对线性回归都有一定的了解,即对于多维空间中存在的样本点,我们用特征的线性组合去拟合空间中点的分布和轨迹。如下图所示:     线性回归能对连续值结果进行预测,

寒小阳 13万+

开关问题【Contest Hunter 0201】

题目给了T个5*5的01矩阵,你可以将该矩阵中任意位置的数0变1,1变0,在你改变该位置的数时,它的上下左右四个位置的数也会同时发生改变。问你能否6步及以内将该矩阵变为全1矩阵,如果能输出最少步数,否则输出-1。 这道题一看好像毫无思路,但是你仔细想一想,会发现每个点最多被修改一次,不然就不优了。 并且,我们在固定第一行后,第二行的状态就可以确定了,如果当前位置的上方为0,那么该位置必须被改变...

zhangjingyanzjyer的博客 355

Dify整合FireCrawl与百度搜索实战:手把手教你打造全能研究助手

本文手把手教你基于Dify平台,整合FireCrawl网页爬虫与百度搜索能力,构建一个能同时处理本地文档与实时网络信息的全能研究助手。通过部署核心环境、配置模型、接入两大工具并设计自动化工作流,实现从问题提出到深度分析报告生成的一站式解决方案,极大提升信息调研与整合效率。

weixin_29062963的博客 501

轴承故障诊断——领域知识

幅域分析、频域分析及轴承方面的领域知识

qq_58516607的博客 3536

POJ1830,01矩阵高斯消元

拿到这道题后,没啥思路,后来看了几份解题报告后,才发现这题用线性方程组来解,终于知道了线性代数在ACM的用武之地了。由于是中文题,题目解释略。直接说解题思路:设A矩阵是灯泡关系矩阵,A[[I][J]表明:对第J个灯实行一次操作后,第I个灯的状态也随之改变。B为结果矩阵,也就是灯的状态是否改变,改变为1,不变为0.这样AX=B求X即为题目中的解。本题求的是解的个数,有线性代数知识所得:当AX=B增广

my coding life 4047

Unipush2.0 App消息推送(在线+离线推送)

使用unipush2.0进行消息推送,包含在线跟离线

weixin_50251467的博客 3701

第二章,用矩阵解线性方程组,01-高斯消元法

第二章,用矩阵解线性方程组,01-高斯消元法行列式的局限超定方程组与欠定方程组消元法与同解变换消元法同解变换等价矩阵的定义矩阵元素、行标和列标行矩阵或行向量 玩转线性代数的笔记 行列式的局限 超定方程组与欠定方程组 有两种情况不能使用行列式来解 线性方程组的方程个数m多于未知数个数n,称为超定方程组 相反,方程个数m少于未知数个数n,称为欠定方程组 消元法与同解变换 消元法 用一个更易求解的线性方程组代替原线性方程组,例见原文 变换类型: 交换 交换两个方程的位置 数乘 将其中一个方程乘以一个不为零的

qq_17065591的博客 3075

Python高效转换病理图像:从mrxs到SVS的完整实践指南

本文提供了使用Python将数字病理切片从mrxs格式高效转换为SVS格式的完整实践指南。针对mrxs格式兼容性差的问题,文章详细解析了基于openslide和tifffile库的核心转换流程,并重点分享了应对大内存消耗的优化方案与流式处理技巧,确保转换后的SVS文件保留多分辨率金字塔结构,兼容主流病理分析工具。

weixin_29051811的博客 550

评价模型——层次分析法(AHP)与熵权法(EWM)

层次分析法是定性与定量结合的多准则决策、评价方法。将决策的有关元素分解成目标层、准则层和方案层,并通过人们的判断对决策方案的优劣进行排序,在此基础上进行定性和定量分析。它把人的思维过程层次化、数量化,并用数学为分析、决策、评价、预报和控制提供定量的依据。

好好学习 天天向上 2万+

开关问题 POJ - 1830 高斯消元

开关问题 POJ - 1830 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以...

九大于七的博客 3333

thermal系列(5)-DTSI中配置Thermal

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.youkuaiyun.com/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录thermal系列目录DTSI中配置ThermalDTSI节点类型描述CPU0的配置举例CPU核hot-plugging举例修改热缓解阈值DTSI的node中带有tracks-lowDTSI中关闭某个Thermal Zones thermal系列目录 thermal系列(1)-引言部分 thermal.

fulinux的博客 1232

开关问题(POJ-1830)

Problem Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计...

Alex_McAvoy的博客 4561

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

poj 1830 开关问题 (高斯消元模板)

开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8188 Accepted: 3239 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相

xxxxx 678

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

poj 1830(高斯消元)

开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5771   Accepted: 2172 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系

my_acm 826

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

POJ1830 开关问题 高斯消元

将初始状态与终止状态相应项异或得到的结果与原题中的操作矩阵组成增广矩阵。 最后的答案是 2^res   res为自由元的数量。 另外方程组可能无解。这里要注意 误解的情况就是一行前n项为0最后一项非0 这是按照题目要求输出即可 开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4

622

[poj1830]: 开关问题

开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8666   Accepted: 3405 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系

Edt! 703

高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185

最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了。现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧。 专题:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=29538#overview 专题地址来源于kuangbin大神,多谢kuangbin大神总结的高斯消元的模板,菜鸟在此谢过啊。 P

1127

POJ 1830 开关问题

开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7739 Accepted: 3037Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你

LuRiCheng的博客 1791

POJ_1830_开关问题

高斯消元自由元个数

edward_108 286

poj 1830 开关问题(高斯消元)

终止状态是从初始状态由开关组合影响而形成的,那么就有一个等式使得初始状态可以到达终止状态, 例如a,b,c三个开关 E[a] = (xa * mp[a][a]) ^ (xb * mp[a][b]) ^ (xc*map[a][c]) ^ S[a] E[b] = (xa * mp[b][a]) ^ (xb * mp[b][b]) ^ (xc*map[b][c]) ^ S[b] E[c] =

ljd4305的专栏 2770

POJ 开关问题 1830【高斯消元求矩阵的秩】

Language: Default 开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6656   Accepted: 2541 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关

豫帝哥哥 2210

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

开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4937   Accepted: 1801 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相

炒饭君的博客 1116

poj 1830 开关问题 【高斯消元 求解自由变元数目】

开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6771   Accepted: 2589 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系

世界很大 869

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

题意有n个开关,按动按钮可以改变灯泡的开关状态,有些开关之间是有联系的,给出初始状态和目标状态,求是否可行,如果可行,求方案数目。思路我们可以另矩阵[x1,x2...xn][x_1,x_2...x_n]来表示解集,即第i个开关需要按动的次数,最后的状态即[b1,b2...bn][b_1,b_2...b_n],原状态是[a1,a2...an][a_1,a_2...a_n],即A*X=B,这里没有要求解

Winterfell30' Blog 576
上一篇: HDU 2157 How many ways?? 【矩阵经典8】
下一篇: Codeforces Round #521 (Div. 3) D. Cutting Out 【二分+排序】
莜莫oO
博客等级 码龄9年 7粉丝 226原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值