輸入乙個n
nn元異或方程組,包含n
nn個方程,係數為0
00或1
11,右邊常數項也是0
00或1
11。求解之。方程為: a_x_1\wedge a_x_2\wedge...\wedge a_x_n = b_1\\a_x_1\wedge a_x_2\wedge...\wedge a_x_n = b_2\\...\\a_x_1\wedge a_x_2\wedge...\wedge a_x_n = b_n \end
⎩⎪⎪⎪⎨⎪
⎪⎪⎧
a11
x1∧
a12
x2∧
...∧
a1n
xn=
b1a
21x
1∧a
22x
2∧.
..∧a
2nx
n=b
2..
.an1
x1
∧an2
x2
∧...
∧ann
xn
=bn
如果解不唯一,則輸出「multiple sets of solutions」,如果無解,就輸出「no solution」。
輸入格式:
第一行包含整數n
nn。接下來n
nn行,每行包含n+1
n+1n+
1個整數0
00或1
11,表示乙個方程的n
nn個係數以及等號右側的常數。
輸出格式:
如果給定線性方程組存在唯一解,則輸出共n
nn行,其中第i
ii行輸出第i
ii個未知數的解。如果給定線性方程組存在多組解,則輸出「multiple sets of solutions」。如果給定線性方程組無解,則輸出「no solution」。
資料範圍:
1 ≤n
≤100
1\le n\le 100
1≤n≤10
0 可以用高斯消元法(嚴格來說需要論證一下這個方程是不是和通常的線性方程組有類似的性質。取二元域f
2\mathbb_2
f2,加法定義為異或,乘法定義為通常數的乘法,可以驗證(,∧
,×
)(\,\wedge, \times )
(,∧,×)
確實是個域。乘法也可以取與操作,域也可以寫成(,∧
,&
)(\,\wedge, \& )
(,∧,&)
,這兩個域完全等價。對於域上的線性方程組,結論都是類似的,所以高斯消元法也可以用)。思路參考**如下:
#include
using
namespace std;
const
int n =
110;
int n;
int a[n]
[n];
// 返回0是有唯一解,返回1是多組解,返回2是無解
intgauss()
// 如果都是0,就略過,繼續遍歷下一列if(
!a[t]
[c])
continue
;// 將當前列值為1的那行換到前面去
for(
int i = c; i <= n; i++
)swap
(a[t]
[i], a[r]
[i])
;// 把主元下方的值都變成0
for(
int i = r +
1; i < n; i++)if
(a[i]
[c])
for(
int j = c; j <= n; j++
) a[i]
[j]^
= a[r]
[j];
r++;}
if(r < n)
// 如果有唯一解,
for(
int i = n -
2; i >=
0; i--
)for
(int j = i +
1; j < n; j++
)// 這裡的&其實就是乘法,而^其實就是加法
a[i]
[n]^
= a[i]
[j]& a[j]
[n];
return0;
}int
main()
時間複雜度o(n
3)
o(n^3)
o(n3
),空間o(1
)o(1)
o(1)
。
高斯消元異或版模板
2016 09 08 晚上 author itak motto 今日的我要超越昨日的我,明日的我要勝過今日的我,以創作出更好的 為目標,不斷地超越自己。include include include include include include include include include us...
acwing 883 高斯消元解線性方程組
題目位址 模擬初等行變換就可以了。有很多種模擬,對於此題方便,有了這個模擬。從第一列開始,列舉未處理的行找到最大的主元素。交換最大主元素的行和當前行。如果最大主元素也為0,則不處理。把主元素的係數化為1.把其他未處理行的主元素列的係數都消去。繼續處理,知道最後一列。之後特判r是否把所有列處理完,沒有...
jzoj3823 遇見 高斯消元解異或方程組
description zyh獨自一人在街上漫步。zyh相信不久後應該就可以和她一起漫步,可是去 尋找那個她呢?zyh相信每個人都有乙個愛情的號碼牌,這個號碼牌是乙個n n的矩陣。每個人都要在矩陣中選擇若干個元素,使得每行每列都有奇數個數被選中,且選中的數字的乘積是完全平方數。每當選出了這若干個元素...