日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开关问题(模板+高斯消元)

發(fā)布時(shí)間:2024/8/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开关问题(模板+高斯消元) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
開關(guān)問題
Time Limit:?1000MS?Memory Limit:?30000K
Total Submissions:?7771?Accepted:?3058

Description

有N個(gè)相同的開關(guān),每個(gè)開關(guān)都與某些開關(guān)有著聯(lián)系,每當(dāng)你打開或者關(guān)閉某個(gè)開關(guān)的時(shí)候,其他的與此開關(guān)相關(guān)聯(lián)的開關(guān)也會(huì)相應(yīng)地發(fā)生變化,即這些相聯(lián)系的開關(guān)的狀態(tài)如果原來為開就變?yōu)殛P(guān),如果為關(guān)就變?yōu)殚_。你的目標(biāo)是經(jīng)過若干次開關(guān)操作后使得最后N個(gè)開關(guān)達(dá)到一個(gè)特定的狀態(tài)。對(duì)于任意一個(gè)開關(guān),最多只能進(jìn)行一次開關(guān)操作。你的任務(wù)是,計(jì)算有多少種可以達(dá)到指定狀態(tài)的方法。(不計(jì)開關(guān)操作的順序)

Input

輸入第一行有一個(gè)數(shù)K,表示以下有K組測(cè)試數(shù)據(jù)。?
每組測(cè)試數(shù)據(jù)的格式如下:?
第一行 一個(gè)數(shù)N(0 < N < 29)?
第二行 N個(gè)0或者1的數(shù),表示開始時(shí)N個(gè)開關(guān)狀態(tài)。?
第三行 N個(gè)0或者1的數(shù),表示操作結(jié)束后N個(gè)開關(guān)的狀態(tài)。?
接下來 每行兩個(gè)數(shù)I J,表示如果操作第 I 個(gè)開關(guān),第J個(gè)開關(guān)的狀態(tài)也會(huì)變化。每組數(shù)據(jù)以 0 0 結(jié)束。?

Output

如果有可行方法,輸出總數(shù),否則輸出“Oh,it's impossible~!!” 不包括引號(hào)

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

第一組數(shù)據(jù)的說明:?
一共以下四種方法:?
操作開關(guān)1?
操作開關(guān)2?
操作開關(guān)3?
操作開關(guān)1、2、3 (不記順序)?

Source

LIANGLIANG@POJ

Description

有N個(gè)相同的開關(guān),每個(gè)開關(guān)都與某些開關(guān)有著聯(lián)系,每當(dāng)你打開或者關(guān)閉某個(gè)開關(guān)的時(shí)候,其他的與此開關(guān)相關(guān)聯(lián)的開關(guān)也會(huì)相應(yīng)地發(fā)生變化,即這些相聯(lián)系的開關(guān)的狀態(tài)如果原來為開就變?yōu)殛P(guān),如果為關(guān)就變?yōu)殚_。你的目標(biāo)是經(jīng)過若干次開關(guān)操作后使得最后N個(gè)開關(guān)達(dá)到一個(gè)特定的狀態(tài)。對(duì)于任意一個(gè)開關(guān),最多只能進(jìn)行一次開關(guān)操作。你的任務(wù)是,計(jì)算有多少種可以達(dá)到指定狀態(tài)的方法。(不計(jì)開關(guān)操作的順序)

Input

輸入第一行有一個(gè)數(shù)K,表示以下有K組測(cè)試數(shù)據(jù)。?
每組測(cè)試數(shù)據(jù)的格式如下:?
第一行 一個(gè)數(shù)N(0 < N < 29)?
第二行 N個(gè)0或者1的數(shù),表示開始時(shí)N個(gè)開關(guān)狀態(tài)。?
第三行 N個(gè)0或者1的數(shù),表示操作結(jié)束后N個(gè)開關(guān)的狀態(tài)。?
接下來 每行兩個(gè)數(shù)I J,表示如果操作第 I 個(gè)開關(guān),第J個(gè)開關(guān)的狀態(tài)也會(huì)變化。每組數(shù)據(jù)以 0 0 結(jié)束。?

Output

如果有可行方法,輸出總數(shù),否則輸出“Oh,it's impossible~!!” 不包括引號(hào)

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

第一組數(shù)據(jù)的說明:?
一共以下四種方法:?
操作開關(guān)1?
操作開關(guān)2?
操作開關(guān)3?
操作開關(guān)1、2、3 (不記順序)?

Source

LIANGLIANG@POJ 注意:題目中i和j說反了 個(gè)燈可以控制自己和其他的一些燈,xi代表第i個(gè)燈是否操作,所以xi的值只會(huì)是0或1。 對(duì)每一個(gè)燈的來說,肯能會(huì)收幾個(gè)燈的控制,如果第i個(gè)燈被第k個(gè)燈控制,那么xk的系數(shù)為1,否則為0,。結(jié)果如果變化為1,不變化為0,所以得到一個(gè)異或方程組。 求解這個(gè)異或方程組,進(jìn)行高斯消元 異或方程組的高斯消元的方式,和不同的高斯消元大部分相同,但是不是用減,而是判斷要消的那行如果是1,進(jìn)行異或,否則不動(dòng)。 通過高斯消元,可以判斷出方程是否有解,和解的個(gè)數(shù)。 如本題中求出矩陣的自由元數(shù)num1個(gè)。所以這num1個(gè)值的取值對(duì)結(jié)果是沒有影響的,又因?yàn)閤i只能取0或1,所以方法數(shù)位2^num1 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ; int Map[30][30] , a[30] ; void swap1(int p,int q,int n) {int j , temp ;temp = a[p] ; a[p] = a[q] ; a[q] = temp ;for(j = 1 ; j <= n ; j++){temp = Map[p][j] ; Map[p][j] = Map[q][j] ; Map[q][j] = temp ;}return ; } int solve(int n) {int i , j , k , t = 1 , num1 = 0 ;for(i = 1 ; i <= n && t <= n ; i++){for(j = i ; j <= n ; j++)if( Map[j][t] )break ;if(j == n+1){t++ ;i-- ;num1++;continue ;}if( i != j )swap1(i,j,n) ;for(j = i+1 ; j <= n ; j++){if( Map[j][t] == 0 ) continue ;for(k = t ; k <= n ; k++)Map[j][k] = Map[i][k] ^ Map[j][k] ;a[j] = a[i] ^ a[j] ;}t++ ;}for( ; i <= n ; i++)if( a[i] == 1 )return -1 ;return num1 ; } int main() {int t , n , i , j , x ;scanf("%d", &t) ;while( t-- ){memset(Map,0,sizeof(Map)) ;scanf("%d", &n) ;for(i = 1 ; i <= n ; i++){scanf("%d", &a[i]) ;Map[i][i] = 1 ;}for(i = 1 ; i <= n ; i++){scanf("%d", &x) ;a[i] = a[i]^x ;}int u , v ;while( scanf("%d %d", &v, &u) ){if( u == 0 && v == 0 ) break ;Map[u][v] = 1 ;}x = solve(n) ;if( x == -1 )printf("Oh,it's impossible~!!\n") ;elseprintf("%d\n", 1<<x) ;}return 0; }


異或方程組的高斯消元模板:
//有equ個(gè)方程,var個(gè)變?cè)T鰪V矩陣行數(shù)為equ,列數(shù)為var+1,分別為0到varint equ,var;int a[MAXN][MAXN]; //增廣矩陣int x[MAXN]; //解集int free_x[MAXN];//用來存儲(chǔ)自由變?cè)?#xff08;多解枚舉自由變?cè)梢允褂?#xff09;int free_num;//自由變?cè)膫€(gè)數(shù)//返回值為-1表示無解,為0是唯一解,否則返回自由變?cè)獋€(gè)數(shù)int Gauss(){int max_r,col,k;free_num = 0;for(k = 0, col = 0 ; k < equ && col < var ; 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(a[max_r][col] == 0){k--;free_x[free_num++] = col;//這個(gè)是自由變?cè)猚ontinue;}if(max_r != k){for(int j = col; j < var+1; j++)swap(a[k][j],a[max_r][j]);}for(int i = k+1;i < equ;i++){if(a[i][col] != 0){for(int j = col;j < var+1;j++)a[i][j] ^= a[k][j];}}}for(int i = k;i < equ;i++)//進(jìn)入此循環(huán)的條件:本身矩陣行大于列 或者 因?yàn)槌霈F(xiàn)自由變?cè)笫沟梅亲杂勺冊(cè)獢?shù)比行數(shù)小if(a[i][col] != 0)//若等號(hào)右邊是1則無解,因?yàn)榈忍?hào)左邊已經(jīng)消為0return -1;//無解if(k < var) return var-k;//自由變?cè)獋€(gè)數(shù)//唯一解,回代for(int i = var-1; i >= 0;i--){x[i] = a[i][var];for(int j = i+1;j < var;j++)x[i] ^= (a[i][j] && x[j]);}return 0;}

異或方程組的高斯消元模板:

總結(jié)

以上是生活随笔為你收集整理的开关问题(模板+高斯消元)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。