高斯消元求方案數 HDU3364

2021-08-05 21:21:13 字數 1413 閱讀 9788

難點在於構建方程組

題目大意:

有 n 盞燈,m 個開關,每個開關可以控制多盞燈,每盞燈可以被多盞開關控制。開

始每盞燈都是開閉狀態,給定每盞燈的最終狀態,問有多少種方案可以到達。

解題思路:

對於每一盞燈,可以列出乙個方程,這樣就可以列出 n 個方程,有 m 個未知量。從

而構成乙個 n*m 的矩陣,對應每盞燈的最終狀態。構建乙個增廣矩陣,用高斯消元

法求解自由變元個數 ans。因為開關只有開、關兩種狀態,所以答案為 2^ans。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define ull unsigned long long

#define pii pair

#define inf 1000000007

const

double eps=1e-5;

const

int maxn=55;

int matrix[maxn][maxn];//儲存增廣矩陣

int copymatrix[maxn][maxn];//增廣矩陣的副本

int gauss(int a[maxn],const

int&m,const

int&n)

if(a[r][i]==0)

for(int j=0;j//消去其他方程的i變元

if((j!=r)&&(a[j][i]!=0))

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

a[j][k]^=a[r][k];

++r;//矩陣的秩+1

}//矩陣的秩下面的方程 係數都為0 0*x1+0*x2+...+0*xm恆等於0 !=0則無解

for(int i=r;iif(a[i][m])//判斷是否無解

return -1;

return res;

}int main()

}printf("case %d:\n",ca);

int q;

scanf("%d",&q);

while(q--)

}return

0;}

hdu3364 Lanterns 高斯消元

有m個開關,n個燈泡,每個開關可以控制不同的燈泡 可以有多個 給定n個燈泡的亮暗情況,問有多少種開關的情況 用a i j 表示第j個開關對第i個燈泡能否控制,1為能,0為否 用高斯消元,ans 2 var k var k 為自由變數數 include include include using na...

hdu 3915 高斯消元

這道題目是和博弈論掛鉤的高斯消元。本題涉及的博弈是nim博弈,結論是 當先手處於奇異局勢時 幾堆石子數相互異或為0 其必敗。思路在這裡,最後由於自由變元能取1 0兩種狀態,所以,最終答案是2 k,k表示自由變元的個數。include include include include include i...

HDU 5755 高斯消元

題意 給出乙個模3意義下的矩陣,每次選中乙個元素就可以使得自身 2,上下左右元素 1。求所有元素變成0的一種解。o nm 3 怎麼會不炸!怎麼會不炸!好吧就是不炸,可能在消元的時候0比較多吧 可以為什麼不用列舉自由元呢?不是很懂這個資料 直接按照上下左右自身的元素對自己的貢獻建立方程組暴力消元,遇到...