bzoj3503 Cqoi2014 和諧矩陣

2022-03-18 10:26:54 字數 1288 閱讀 7217

bzoj3503[cqoi2014]和諧矩陣

題意:我們稱乙個由0和1組成的矩陣是和諧的,當且僅當每個元素都有偶數個相鄰的1。乙個元素相鄰的元素包括它本身,及他上下左右的4個元素(如果存在)。給定矩陣的行數和列數,計算並輸出乙個和諧的矩陣。注意:所有元素為0的矩陣是不允許的。行列數≤40

題解:設矩陣為a,則a[i][j]^a[i+1][j]^a[i-1][j]^a[i][j-1]^a[i][j+1]為0,用i-1替換i則得a[i-1][j]^a[i][j]^a[i-2][j]^a[i-1][j-1]^a[i-1][j+1]=0,每乙個元素都與其上面的元素相關,因此可以說第一行的元素決定了所有元素。同時第一行的填法合法當且僅當用第一行推出a[m+1][i]的所有元素都為0。故可以找到a[m+1][j]與第一行哪些元素相關,然後列異或方程組。這個過程可以用二進位製弄。如何保證不出現所有元素為0的矩陣出現呢?只要高斯消元時把自由元都當做1就行了,這樣一來就必須回代了。反思:二進位制操作要用到longlong,然而我強制轉換亂寫一通導致我wa了n次。尤其是這個地方:m[i][j]=((ll)1<<(j-1)&a[n+1][i])?1:0,我原來是這樣寫的m[i][j]=((ll)(1<<(j-1)&a[n+1][i])?1:0,這兩種解法不同是因為後者先將乘法算出來並溢位了,然後才被轉換,而前者不同是因為它把乘數轉換了,而longlong*int的結果為longlong故不會溢位,以後要記牢這一點。

**:

1 #include 2 #include 3 #include 4 #include 5

#define maxn 50

6#define inc(i,j,k) for(int i=j;i<=k;i++)

7#define ll long long

8using

namespace

std;

910 bitset m[maxn];

11 ll a[maxn][maxn];int

b[maxn][maxn],n,m;

12void

gauss()

18for(int i=m;i>=1;i--) inc(j,i+1,m)if(m[i][j])b[1][i]^=b[1

][j];20}

21}22int

main() gauss();

26 inc(i,2,n)inc(j,1,m)b[i][j]=b[i-2][j]^b[i-1][j-1]^b[i-1][j+1]^b[i-1

][j];

27 inc(i,1,n)

28return0;

29 }

20160616

BZOJ3503 Cqoi2014 和諧矩陣

我們發現確定了一行之後,為使這一行沒有不合法情況,下一行就確定了,所以我們可以用第一行的數表示出整個矩陣,而合法當且僅當第n 1行全為0,用n 1行的表示高斯消元出第一行然後遞推整個矩陣即可 include include include include include include includ...

bzoj3503 CQOI2014 和諧矩陣

題目描述 我們稱乙個由0和1組成的矩陣是和諧的,當且僅當每個元素都有偶數個相鄰的1。乙個元素相鄰的元素包括它本身,及他上下左右的4個元素 如果存在 給定矩陣的行數和列數,請計算並輸出乙個和諧的矩陣。注意 所有元素為0的矩陣是不允許的。分析 1.這種矩陣的,乙個元素和它上下左右有關係的,一般都是高斯消...

BZOJ 3503 Cqoi2014 和諧矩陣

bzoj 3503 cqoi2014 和諧矩陣 高斯消元 題意 我們稱乙個由0和1組成的矩陣是和諧的,當且僅當每個元素都有偶數個相鄰的1。乙個元素相鄰的元素包括它本身,及他上下左右的4個元素 如果存在 給定矩陣的行數和列數,請計算並輸出乙個和諧的矩陣。注意 所有元素為0的矩陣是不允許的。分析 設n ...