1. 程式人生 > >POJ 開關問題 1830【高斯消元求矩陣的秩】

POJ 開關問題 1830【高斯消元求矩陣的秩】

Language: 開關問題
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 6656 Accepted: 2541

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 (不記順序) 

Source


中文題~不翻譯。。偷笑

解題思路:主要是始末矩陣的處理方法。可以讓A+X=B 兩邊同時異或A就可以了。這樣就能簡單得到增廣矩陣。

a[i][j]是j燈控制i燈。記得把a[i][i]的情況加上,差點忽略這點,自己當然可以控制自己啊。

AC程式碼:

#include <stdio.h>
#include <math.h>
#include <vector>
#include <queue>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define MAXN 31

using namespace std;

int equ,var;
int a[MAXN][MAXN];

int Gauss()
{
    int col=0;
    int k,max_r;
    for(k=0;col<var&&k<equ;k++,col++){
        max_r=k;
        for(int i=k+1;i<equ;i++)
            if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;
        if(max_r!=k){
            for(int i=col;i<=var;i++)
                swap(a[k][i],a[max_r][i]);
        }
        if(!a[k][col]){
            k--;
            continue;
        }
        for(int i=k+1;i<equ;i++)
            if(a[i][col])
            for(int j=col;j<=var;j++)
            a[i][j]^=a[k][j];
    }
    for(int i=k;i<equ;i++)
        if(a[i][col]) return -1;
    return var-k;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        memset(a,0,sizeof(a));
        scanf("%d",&equ);
        var=equ;
        int b;
        for(int i=0;i<equ;i++){
            //a[i][i]=1;
            scanf("%d",&b);
            a[i][var]=b;
        }
        for(int i=0;i<equ;i++){
            scanf("%d",&b);
            a[i][var]^=b;
        }
        int I,J;
        while(scanf("%d%d",&I,&J),I!=0||J!=0){
            a[J-1][I-1]=1;
        }
        for(int i=0;i<equ;i++) a[i][i]=1;
        int res=Gauss();
        if(res<0)printf("Oh,it's impossible~!!\n");
        else printf("%d\n",1<<res);
    }
    return 0;
}

相關推薦

POJ 開關問題 1830矩陣

Language: 開關問題 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6656 Accepted: 2541

BZOJ3168[Heoi2013]鈣鐵鋅硒維生素 矩陣的逆+匈牙利算法

def strong bzoj light sof turn 防止 宇宙 != 【BZOJ3168】[Heoi2013]鈣鐵鋅硒維生素 Description 銀河隊選手名單出來了!小林,作為特聘的營養師,將負責銀河隊選手參加宇宙比賽的飲食。眾所周知,前往宇宙的某個

期望LightOJ

Step1 Problem: 有 100 個格子,從 1 開始走,每次拋骰子走 1~6,如果所走位置大於 100,則重新拋骰子。i 會被傳送至 nex[i]。 問你從 1 走到 100 所拋骰子的期望次數。 Step2 Ideas: 由期望公式可得:dp[

矩陣的逆

線性基 單位矩陣 線性 行列式 math pan class clas 同時 以前的博客:高斯消元,線性基,行列式。 考慮將\(A\)消成單位矩陣,同時對單位矩陣\(I\)做同樣的操作,這樣\(A\)變成\(I\),而\(I\)變成\(A^{-1}\)。 用高斯消元即可。

BZOJ2844albus就是要第一個出場 線性基

子集 高斯 efi continue clas sum ext ++ pre 【BZOJ2844】albus就是要第一個出場 Description 已知一個長度為n的正整數序列A(下標從1開始), 令 S = { x | 1 <= x <= n },

BZOJ2460[BeiJing2011]元素 貪心+線性基

%d 很好 jin 種類 namespace 隨著 clu rip ret 【BZOJ2460】[BeiJing2011]元素 Description 相傳,在遠古時期,位於西方大陸的 Magic Land 上,人們已經掌握了用魔法礦石煉制法杖的技術。那時人們就

BZOJ2322[BeiJing2011]夢想封印 線性基+DFS+set

思考 包含 cst 計算 next 裏的 是否 異或和 無法使用 【BZOJ2322】[BeiJing2011]夢想封印 Description 漸漸地,Magic Land上的人們對那座島嶼上的各種現象有了深入的了解。 為了分析一種奇特的稱為夢想封印(Fanta

POJ 2947-Widget Factory(解同余方程式)

free popu == += 3-9 sca -m stack art 題目地址:id=2947">POJ 2947 題意:N種物品。M條記錄,接寫來M行,每行有K。Start,End,表述從星期Start到星期End,做了K件物品。接下來的K個數為物品的編號。

枚舉Gym - 101412D - Find the Outlier

void while ... () fine blog 個數 i+1 find 給你一個未知的d次多項式在0,1,...,d+2處的取值,其中有且只有一個是錯的,問你哪個是錯的。 枚舉哪個是錯的,再在剩下的d+2個中取d+1個高斯消元,解出多項式系數,然後代一下最後剩下的那

CDOJ1785 曜醬的線性代數課堂(三)

++i for cnblogs mes swa eps mem else 正在 高斯消元求行列式板子。 #include<cstdio> #include<cmath> #include<algorithm> #include

CDOJ1783 曜醬的線性代數課堂(一)

turn abs swap size wap n) memset efi 高斯 高斯消元求逆矩陣板子。 #include<cstdio> #include<cmath> #include<algorithm> #include

CDOJ1784 曜醬的線性代數課堂(二)

cst %d can cstring 課堂 esp 線性 memset () 高斯消元求矩陣秩板子。 #include<cstdio> #include<cmath> #include<algorithm> #include&

[poj1830]開關問題(

math main 問題 size class con ret str int 題意:求高斯消元中自由元的個數,輸出1<<ans; 1 #include<cstdio> 2 #include<cstdlib> 3 #inc

bzoj 2337 [HNOI2011]XOR和路徑+dp

name 直接 ring size scanf 高斯消元 str pre hnoi 首先,我們發現,因為是無向圖,所以相連的點之間是有“依賴性”的,所以不能直接用dp求解。 因為是xor,所以按位處理,於是列線性方程組,設$ x[i] $為點i到n異或和為1的期望,因為從1

bzoj 3143 [Hnoi2013]遊走+dp

sca source include hnoi2013 esp cst cpp std ans 參考:http://blog.csdn.net/vmurder/article/details/44542575 和2337有點像 設點u的經過期望(還是概率啊我也分不清,以下都

BZOJ3503 [Cqoi2014]和諧矩陣

math esp fine eps bzoj3503 mem 組成 time ios 3503: [Cqoi2014]和諧矩陣 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1197

bzoj 1923: [Sdoi2010]外星千足蟲

ios eterm char max ear space \n term n+1 裸的異或高斯消元 #include<iostream> #include<cstdio> using namespace std; const int N=2005;

板子

#include<stdio.h>///poj 2947當作板子可能更好一下 #include<algorithm> #include<iostream> #include<string.h> #include<math.h> usin

hdu5955 Guessing the Dice RollAC自動機概率待補...

inpu ont recommend match ble 北大 problem ng2 bottom 2016沈陽區域賽http://acm.hdu.edu.cn/showproblem.php?pid=5955 Guessing the Dice Roll Time Li

字串KMPBZOJ4820硬幣遊戲

分析: 如果資料範圍再小點,可以利用BZOJ1444有趣的遊戲方法來做。 所以這裡為了優化,直接儲存下來從某個字串轉移到另一個的概率即可。 #include<cstdio> #include