poj 1830 高斯消元

终于会一点高斯消元了,认真学还是学的进去啊。。。。。。

搞明白解异或方程的原理,然后构造出矩阵就好做了。模板题

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <stack>
 5 #include <queue>
 6 #include <map>
 7 #include <algorithm>
 8 #include <vector>
 9 #include <cstdlib>
10
11 using namespace std;
12
13 const int maxn = 1000005;
14
15 typedef long long LL;
16
17 int A[35][35];
18
19 int gauss(int m,int n) //m个方程,n个变量
20 {
21     int i=0,j=0,k,r,u;
22     while(i < m && j <n ){ //当前处理i个方程j个变量
23         r = i;
24         for(k = i;k < m;k++){
25             if(A[k][j]){
26                 r = k;
27                 break;
28             }
29         }
30         if(A[r][j]){
31             if(r != i){
32                 for(k = 0;k <= n;k++) swap(A[r][k],A[i][k]);
33             }
34             for(u = i+1;u < m;u++){
35                 if(A[u][j]) for(k = i;k <= n;k++) A[u][k] ^= A[i][k];
36             }
37             i++;
38         }
39         j++;
40
41     }
42     for(j = i;j<n;j++){
43         if(A[j][n]) return -1;
44     }
45     return n-i;
46 }
47
48 int main()
49 {
50    int t;
51    scanf("%d",&t);
52    int s[35],e[35];
53    while(t--){
54         memset(A,0,sizeof(A));
55         memset(s,0,sizeof(s));
56         memset(e,0,sizeof(e));
57         int n;
58         scanf("%d",&n);
59         for(int i=0;i<n;i++){
60             scanf("%d",&s[i]);
61         }
62         for(int i=0;i<n;i++){
63             scanf("%d",&e[i]);
64         }
65         for(int i=0;i<n;i++){
66             if(s[i] != e[i])
67                 A[i][n] =1;
68             A[i][i] = 1;
69         }
70         int a,b;
71         while(scanf("%d%d",&a,&b)&&a+b){
72             a--;
73             b--;
74             A[b][a] = 1;
75         }
76         int ans = gauss(n,n);
77         if(ans == -1) puts("Oh,it‘s impossible~!!");
78         else printf("%d\n",1<<ans);
79
80    }
81     return 0;
82 }

时间: 2024-10-27 13:57:26

poj 1830 高斯消元的相关文章

POJ SETI 高斯消元 + 费马小定理

http://poj.org/problem?id=2065 题目是要求 如果str[i] = '*'那就是等于0 求这n条方程在%p下的解. 我看了网上的题解说是高斯消元 + 扩展欧几里德. 然后我自己想了想,就用了高斯消元 + 费马小定理.因为%p是质数,所以很容易就用上了费马小定理,就是在除法的时候用一次就好了.还有就是两个模数相乘还要模一次. #include <cstdio> #include <cstdlib> #include <cstring> #inc

*POJ 1222 高斯消元

EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 6246 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons eac

POJ 1222 高斯消元更稳

大致题意: 有5*6个灯,每个灯只有亮和灭两种状态,分别用1和0表示.按下一盏灯的按钮,这盏灯包括它周围的四盏灯都会改变状态,0变成1,1变成0.现在给出5*6的矩阵代表当前状态,求一个能全部使灯灭的解. 分析: 题目已经提示我们,按两次和按零次是一样的效果,所以每个灯的解为0或者1.这样我们可以构造一个30*30的方程组,右边的常数列为灯的初始状态. 影响当前灯的状态的按钮有5个 a[i][j]+x[i][j]+x[i][j-1]+x[i-1][j]+x[i][j+1]+x[i][j+1]=0

POJ 2065-SETI(高斯消元求解同余方程式)

题目地址:POJ 2065 题意:输入一个素数p和一个字符串s(只包含小写字母和'*'),字符串中每个字符对应一个数字,'*'对应0,'a'对应1,'b'对应2.... eg:str[] = "abc", 那么说明 n=3, 字符串所对应的数列为1, 2, 3. 同时题目定义了一个函数:a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1)(mod p), f(1) = str[0] = a = 1; a0*2^0 + a1*2^1+a2

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

http://poj.org/problem?id=1830 高斯消元无解的条件:当存在非法的左式=0而右式不等于0的情况,即为非法.这个可以在消元后,对没有使用过的方程验证是否右式不等于0(此时因为前边消元一定会使得后边的方程左式为0) 高斯消元自由变元:自由变元就是当这些未知量一旦确定,整个方程就确定了.但是这些量是未知的.(例如x+y=5,自由变元就是1,因为无论是x还是y确定,另一个就能唯一确定),而答案要求的是方案,那么显然因为自由变元是可以随便赋值的,而这些值只有2个,开和不开,那么

POJ 1830 开关问题 高斯消元,自由变量个数

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

poj 1830 开关问题 高斯消元

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

POJ 1830 【高斯消元第一题】

首先...使用abs()等数学函数的时候,浮点数用#include<cmath>,其它用#include<cstdlib>. 概念: [矩阵的秩] 在线性代数中,一个矩阵A的列秩是A的线性无关的纵列的极大数目.类似地,行秩是A的线性无关的横行的极大数目. 此题如果有解,解的个数便是2^(自由变元个数),因为每个变元都有两种选择,既1 << n 对于r以下的行,必定全是0,那么如果a[i][n]!=0 必然出现矛盾,于是判定无解. 1 #include <iostr

Poj 1830 高斯消元

开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5418 Accepted: 2022 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开.你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态.对于任意一个开关,最多只能进行一次开关操作.你的任