思路:乍一看好像和线性代数没什么关系。我们用一个数组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(A,b) = n     有唯一解     (n是未知量的个数,即A的列数)

r(A) = r(A,b) < n     有无穷多解

参考:开关问题 POJ - 1830 高斯消元

代码:

  1. #include<queue>
  2. #include<cstring>
  3. #include<set>
  4. #include<map>
  5. #include<stack>
  6. #include<cmath>
  7. #include<vector>
  8. #include<cstdio>
  9. #include<iostream>
  10. #include<algorithm>
  11. typedef long long ll;
  12. const int maxn = + ;
  13. const int seed = ;
  14. const ll MOD = 1e9 + ;
  15. const int INF = 0x3f3f3f3f;
  16. using namespace std;
  17. int A[maxn][maxn], B[maxn], n;
  18. void Gauss(){
  19. ll R = ;
  20. int row = ;
  21. for(int i = ; i <= n && row <= n; i++,row++){
  22. int max_r = row;
  23. for(int j = row + ; j <= n; j++){
  24. if(A[j][i] > A[row][i]){
  25. max_r = j;break;
  26. }
  27. }
  28. if(max_r != row){
  29. for(int k = i; k <= n + ; k++)
  30. swap(A[max_r][k], A[row][k]);
  31. }
  32. if(A[row][i] == ){
  33. row--;
  34. continue;
  35. }
  36. R++;
  37. for(int j = row + ; j <= n; j++){
  38. if(A[j][i]){
  39. for(int k = i; k <= n + ; k++)
  40. A[j][k] = (A[j][k] - A[row][k] + ) % ;
  41. }
  42. }
  43. }
  44. for(int i = row; i <= n; i++){
  45. if(A[i][n + ]){
  46. printf("Oh,it's impossible~!!\n");
  47. return;
  48. }
  49. }
  50. R = n - R;
  51. R = << R;
  52. printf("%lld\n", R);
  53. }
  54. int main(){
  55. int T;
  56. scanf("%d", &T);
  57. while(T--){
  58. scanf("%d", &n);
  59. memset(A, , sizeof(A));
  60. for(int i = ; i <= n; i++)
  61. scanf("%d", &B[i]);
  62. for(int i = ; i <= n; i++){
  63. int v;
  64. scanf("%d", &v);
  65. A[i][n + ] = B[i] ^ v;
  66. A[i][i] = ;
  67. }
  68. int u, v;
  69. while(scanf("%d%d", &u , &v) && u + v){
  70. A[v][u] = ;
  71. }
  72. Gauss();
  73. }
  74. return ;
  75. }

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. POJ.1830.开关问题(高斯消元 异或方程组)

    题目链接 显然我们需要使每个i满足\[( ∑_{j} X[j]*A[i][j] ) mod\ 2 = B[i]\] 求这个方程自由元Xi的个数ans,那么方案数便是\(2^{ans}\) %2可以用^ ...

  5. POJ 3185 The Water Bowls 【一维开关问题 高斯消元】

    任意门:http://poj.org/problem?id=3185 The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  6. POJ - 1681: Painter's Problem (开关问题-高斯消元)

    pro:开关问题,同上一题. 不过只要求输出最小的操作步数,无法完成输出“inf” sol:高斯消元的解对应的一组合法的最小操作步数. #include<bits/stdc++.h> #d ...

  7. POJ - 1222: EXTENDED LIGHTS OUT (开关问题-高斯消元)

    pro:给定5*6的灯的状态,如果我们按下一个灯的开关,它和周围4个都会改变状态.求一种合法状态,使得终状态全为关闭: sol:模2意义下的高斯消元. 终于自己手打了一个初级板子. #include& ...

  8. BZOJ 1013 | 一份写了一堆注释的高斯消元题解

    题意 给出\(n\)维直角坐标系中\(n + 1\)个点的坐标,它们都在一个\(n\)维球面上,求球心坐标. 题解 设球面上某两个点坐标为\((a_1, a_2, ... a_n)\)和\((b_1, ...

  9. A - The Water Bowls POJ - 3185 (bfs||高斯消元)

    题目链接:https://vjudge.net/contest/276374#problem/A 题目大意:给你20个杯子,每一次操作,假设当前是对第i个位置进行操作,那么第i个位置,第i+1个位置, ...

  10. POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)

    依据题意可构造出方程组.方程组的每一个方程格式均为:C1*x1 + C2*x2 + ...... + C9*x9 = sum + 4*ki; 高斯消元构造上三角矩阵,以最后一个一行为例: C*x9 = ...

随机推荐

  1. 【make install】自定义安装目录,添加动态链接库 【--prefix】 【ldconfig】 【LD_LIBRARY_PATH】

    怎么卸载make install安装的软件? https://www.zhihu.com/question/20092756 怎么指定安装目录以及对应的添加动态库的方法 linux库在不指定安装路径时 ...

  2. CentOS工作内容(七)禁用IPV6

    CentOS工作内容(七)禁用IPV6 用到的快捷键 tab 自动补齐(有不知道的吗) ctrl+a 移动到当前行的开头(a ahead) ctrl+e 移动到当前行的开头(e end) ctrl+u ...

  3. CentOS7.1.x+Druid 0.12 集群配置

    原文转载自:https://blog.csdn.net/bigtree_3721/article/details/79583008 先决条件:安装版本列表 本次安装满足下面的条件: CentOS v7 ...

  4. github中的一个快捷键

    在github中,快捷键t的作用是对项目的内容进行查找.在项目目录中按下t键,会进入下面这个界面, 在first-program(这是我自己的项目名)这个项目名后,输入你要查找的内容,即可找到项目中所 ...

  5. [vue]组件最佳实战

    [vue]全局组件和局部组件(嵌套+props引用父组件数据) [vue]组件篇 [vue]组件的创建(componet)和销毁(keep-alive缓存)和父子dom同步nextTick [vue] ...

  6. [py]flask动态展示主机内存图

    echarts基础 需要借助这个图来绘制,动态内存图. 绘制步骤 写py脚本来入库日志 选取合适的echart,并观察图所需的数据格式 用flask返回这个静态的echarts 用flask写接口返回 ...

  7. 蒙特卡罗(Monte Carlo)方法简介

    蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数"的计算方法. 二 解决问题的基本思路 Monte Carlo方法的基本思想很早以前就被人们所发 ...

  8. keras自定义padding大小

    1.keras卷积操作中border_mode的实现 def conv_output_length(input_length, filter_size, border_mode, stride): i ...

  9. 松下 激光位移传感器 API

    一: /* ============================================================================================== ...

  10. css 文本超出容器长度后自动省略的方法!

    我们在给用户显示文本内容的时候,往往需要避免文本内容超出容器宽度,防止换行溢出,小弟在网上找了下发现网上的实现仅仅只是实现了用 ...省略了的功能! 而并没有获取光标提示的功能,所有小弟就结合网上的代 ...