POJ 1830 開關問題 01高斯消元

2021-07-11 10:56:32 字數 1576 閱讀 4156

有n個開關,按動按鈕可以改變燈泡的開關狀態,有些開關之間是有聯絡的,給出初始狀態和目標狀態,求是否可行,如果可行,求方案數目。

我們可以另矩陣[x

1,x2

...x

n]來表示解集,即第i個開關需要按動的次數,最後的狀態即[b

1,b2

...b

n],原狀態是[a

1,a2

...a

n],即a*x=b,這裡沒有要求解出xi

,求出自由元的個數就可以了。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define lowbit(x) ((x)&(-x))

#define lson l, mid, rt << 1

#define rson mid + 1, r, rt << 1|1

#define mp(a, b) make_pair(a, b)

const

int inf = 0x3f3f3f3f;

const

int mod = 1000000007;

const

int maxn = 1e5 + 10;

const

double eps = 1e-8;

const

double pi = acos(-1.0);

typedef pair pii;

int mat[35][35];

int x[35], a[35], b[35];

int var, equ;

int gauss()

if (mat[max_r][col] == 0)

if (max_r != k)

for (int i = k + 1; i < equ; i++)}}

for (int i = k; i < equ; i++)

if (mat[i][col] != 0)

return -1;

if (k < var) return var - k;

for (int i = var - 1; i >= 0; i--)

return0;}

int main()

int i, j;

while (scanf("%d%d", &i, &j))

int ans = gauss();

if (ans == -1)

puts("oh,it's impossible~!!");

else

printf("%d\n", 1

<< ans);

}return

0;}

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