language:
default
開關問題
time limit:1000ms
memory limit:30000k
total submissions:6281
accepted:2390
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
2sample output30 0 0
1 1 1
1 21 3
2 12 3
3 13 2
0 03
0 0 0
1 0 1
1 22 1
0 0
4hintoh,it's impossible~!!
第一組資料的說明:
一共以下四種方法:
操作開關1
操作開關2
操作開關3
操作開關1、2、3 (不記順序)
n個開關給出初始的狀態和結束的狀態 1表示開 0表示關
每個開關只能執行一次操作 問有多少種方法可以使得開關從初始的狀態變為結束的狀態(不計開關的順序)
#include #include #include #include #include #include #include #include #include #define mem(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define mod 10009
#define maxn 40
#define maxm 100010
#define inf 99999999
#define ll __int64
#define bug cout<<"here"<'9') c = getchar();
int x = 0;
while (c >= '0' && c <= '9')
return x;
}void print(int a)
int equ,var;//equ個方程 var個變元 增廣矩陣行數為equ 列數為var+1 分別為0到var
int a[maxn][maxn];//增廣矩陣
int x[maxn];//解集
int free_x[maxn];//儲存自由變元(多解列舉自由變元可以使用)
int free_num;//自由變元的個數
void init()
//返回值為-1表示無解 為0是唯一解 否則返回自由變元個數
int gauss()
if(a[max_r][col]==0)
if(max_r!=k)
{for(int j=col;j=0;i--)
{x[i]=a[i][var];
for(int j=i+1;j
POJ 1830 開關問題 高斯消元
開關問題 time limit 1000ms memory limit 30000k total submissions 3390 accepted 1143 description 有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應...
poj 1830 開關問題 高斯消元
題意是 給一些開關的初始狀態 0 或1 在給出終止狀態,在給出相關的變化規則,規則 x 變化 則 y 也變 x y 讀入。輸出有多少種開關的撥動情況,使初始狀態變成終止狀態。此問題 很容易轉化成 高斯消元 解 異或方程組。t 方程組的自由化的個數,則結果就是 2 t include include ...
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 xa mp c a x...