poj1830 開關問題 高斯消元求解異或方程組

2022-05-31 07:42:07 字數 1470 閱讀 2602

第一道高斯消元題目~

題目:有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應地發生變化,即這些相聯絡的開關的狀態如果原來為開就變為關,如果為關就變為開。你的目標是經過若干次開關操作後使得最後n個開關達到乙個特定的狀態。對於任意乙個開關,最多只能進行一次開關操作。你的任務是,計算有多少種可以達到指定狀態的方法。(不計開關操作的順序)0<=n<=29

我們用樣例來模擬一下:

我的高斯消元求解異或方程組模版:

1

intgauss()

220 i++;21}

22}

23for(j=i;j<=n;j++)

24if(a[j][n+1]) return -1;25

return

1<

);26 }

說一下解的個數問題:

對增廣矩陣[a b]做初等行變換,化成階梯形(高斯消元法),如果存在[0,0,…,0,1]的行,就是無解;如果存在r行[0,0,…,0,0],就意味著有r個自由變數,因為這裡的變數只取0/1,所以有2r個解;如果不存在[0,0,…,0,*],即把最後一行去掉後不存在全0行,則a為滿秩矩陣,則方程組有唯一解。

**:

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;89

const

int n=35;10

intn,bit[n],a[n][n];

1112

void

output()

1320 printf("\n"

);21}22

23int

gauss()

2442 i++;43}

44}

45for(j=i;j<=n;j++)

46if(a[j][n+1]) return -1;47

return

1<

);48}49

50int

main()

5164

while(1)65

70for(int i=1;i<=n;i++) a[i][i]=1;71

int ans=gauss();

72if(ans==-1) printf("

oh,it's impossible~!!\n");

73else printf("

%d\n

",ans);74}

75return0;

76 }

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...