Poj P1830 开关问题___异或高斯消元

题目大意:

有N个开关,存在着某些联系,当变化一个开关后,与之相关的开关也会变化。
你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。
你的任务是,计算有多少种可以达到指定状态的方法。
(不计开关操作的顺序)

0 < N < 29

分析:

将能影响某个开关的所有开关罗列一下,
可以得到一个异或方程组,
可以通过异或高斯消元来解,
当存在 0=1 0 = 1 的情况时则无解
其他情况下,
因为自由元可以取 01 0 或 1
所以方程组的解为 2cnt 2 c n t
cnt c n t 为自由元的数量

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 105

using namespace std;

int a[N], T, n;

int main(){
     scanf("%d", &T);
     while (T--) {
            scanf("%d", &n);
            for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
            for (int i = 1; i <= n; i++) {
                 int x;
                 scanf("%d", &x);
                 a[i] = a[i] ^ x;
                 a[i] = a[i] | (1 << i);
            }
            int x, y;
            while (~scanf("%d %d", &x, &y)) {
                   if (!x && !y) break;
                   a[y] = a[y] | (1 << x);
            } 
            int ans = 1;
            for (int i = 1; i <= n; i++) {
                 for (int j = i + 1; j <= n; j++) 
                      if (a[j] > a[i]) swap(a[i], a[j]);
                 if (!a[i]) {
                      ans = 1 << (n - i + 1); 
                      break;
                 }
                 if (a[i] == 1) {
                      ans = 0;
                      break;
                 }
                 for (int k = n; k >= 1; k--) 
                      if (a[i] >> k & 1) {
                          for (int j = 1; j <= n; j++) 
                               if (i != j && (a[j] >> k & 1)) a[j] = a[j] ^ a[i];
                          break;
                      } 
            }
            if (!ans) printf("Oh,it's impossible~!!\n");
                 else printf("%d\n", ans); 
     }
     return 0;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值