POJ1830 開關問題

2021-07-22 03:09:54 字數 1767 閱讀 3696

中文題目,就不說題目大意了

解題思路:

由於對於每乙個開關最多改變一次,那麼對於每乙個開關,只有改變與不改變兩種操作,設改變操作為1,不改變操作為0,那麼對開關的操作可以用乙個n維向量x⃗ 

t=(x

1,x2

,⋯,x

n),其中xi

=0或者

1 。

我們需要知道初始狀態經過某次操作之後的狀態,並拿它與目標狀態比較。我們知道,對於開關

i,除了對

i 的操作xi

會影響其狀態,與其相關聯的開關

j 的操作xj

也會影響其狀態。顯然,只有當開關

j 影響開關i並且

xj=1

(即改變開關

j ),才會使開關

i改變。令ai

j 表示開關

j 是否影響開關

i,影響為

1 ,不影響為0,則

aijx

j 表示開關

j 是否改變開關

i,改變為

1 ,不改變為

0。若定義ai

i=1 ,那麼∑n

j=1a

ijxj

就表示開關i被改變的次數。顯然,改變次數為奇數,則說明改變初始狀態,反之不變。若用向量b⃗ 

t=(b

1,b2

,⋯,b

n)表示初始狀態與目標狀態之間的關係,bi

表示開關

i 的目標與初始狀態是否一致,

1表示不一致,

0 表示一致,則方程∑n

j=1a

ijxj

≡bi(

mod2

)表示將開關

i 改變為目標狀態。由於模運算的性質,我們可以先對線性方程組ax

=b進行初等行變換再對兩邊取模。由於只需要求可行方案數(即方程解的個數),而並不關心解本身,我們僅僅求得線性方程組係數矩陣與增廣矩陣的秩即可。若r(

a)a,b)

則方程無解(無可行方案),若r(

a)=r

(a,b

)=n 則方程有唯一解(有一種方案),若r(

a)=r

(a,b

)<

n ,由於解向量中自由變元僅有兩種取值(0

或1) ,可行方案數為2r

(a,b

)−r(

a)。

#include

#include

#include

#include

using

namespace

std;

int ab[50][50], st[50], en[50];

inline

int gauss(int n)

if (ab[i][j] == 0)

for (k = i + 1; k < n; k++)

i++, j++;

}for (int k = i; k < n; k++)

if (ab[k][n] != 0) return -1;

return

1<< (n - i);

}int main()

int ans = gauss(n);

if (ans == -1) cout

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

else

cout

<< ans << endl;

}return

0;}

開關問題 POJ 1830

題意 燈泡對應開關,有些開關的撥動會影響其他的開關,給出燈泡初始狀態,給出燈泡結束狀態,問有幾種操作可以完成 思路 建立矩陣,消元後有n個自由變元,答案就是2 n個 include include include includeusing namespace std const int maxn 5...

POJ 1830 開關問題

前述 今天又領略了被假模版坑的心痛,基本都在調 由於被問及相關poj 1222的異或方程組的相關問題,我總算是知道了昨天那個博主為什麼理解了兩天了.原來poj 1222的相關題解都是用矩陣講的異或方程組,講的賊煩,而我正好找了乙個類似卻又不存在的題目,用他的 a了這個poj 1222,渾然不知有這等...

poj 1830 開關問題

這道題是個十分有趣的數學題。有n個開關,這n個開關兩兩之間可能有著關係,如果有關係,按下這個開關,另乙個開關的狀態也會改變。先給你n個開關的初始狀態,再給你n個開關的最終狀態,然後告訴你開關之間的關係,問你能不能通過調整開關使達到最終狀態,如果能,求方案的數量。我們用0,1分別表示開關的兩個不同狀態...