坑比異或方程組?
一開始看到有個人的高斯消元法用異或寫的,而且極其簡短,於是當時就想果然是大牛,怎麼厲害的寫法我肯定懂不了。沒想到晚上看相關習題的時候才發現有這個異或方程組...這就很不清真了。博主說他理解了兩天,可能我看的淺,也沒覺得特別難。感覺大概可以用這樣幾個點來描述異或方程組:
1. 首先,這種方程組適用於對某個物件進行某種操作可以對其他物件產生一定影響,而且只有兩種狀態的情況,一般表示為1和0。
2. 異或方程組的一般形式: (
a[1][1]*x[1])^(a[1][2]*x[2])^......^(a[1][n]^x[n])=y[1] (
a[2][1]*x[1])^(a[2][2]*x[2])^......^(a[2][n]^x[n])=y[2]
...... (
a[i][1]*x[1])^(a[i][2]*x[2])^......^(a[i][n]^x[n])=y[i]
...... (
a[m][1]*x[1])^(a[m][2]*x[2])^......^(a[m][n]^x[n])=y[m]
3. 異或方程組對狀態的描述方式: 一.
若i與j
有關聯,即操作i的話
j會產生變化,那麼
a[j][i]=1
,(一定注意是a[j][i]),若沒有影響,則
a[j][i]=0。二.
若操作i,那麼
x[i]=1。三.
計數時只計算係數不為0的情況,也就是選取進行了操作且產生了影響的項進行異或操作。
4. 異或方程組的解題方式與gauss消元法解線性方程組類似,不過把加減消元替換成了異或消元。
5.不同於線性方程組的求解,異或方程組可以通過狀態壓縮來列舉所有自由元的可能狀態。
模板**:poj 1222 extended lights out(拿原高斯消元模板改的,中間敲錯了乙個地方,又定義了一遍var,導致日常找錯找了一上午......)
#include
#include
#include
#include
#include
#include
#define maxn 110
using namespace std;
int a[maxn][maxn];
int x[maxn*maxn];
int xx[4]=;
int yy[4]=;
int tot,var;
int getmark(int r,int c)
return 0;
}void geta(int i,int j)}}
int gauss()
if (maxr!=k)for (i=c;i<=var+1;i++)swap(a[k][i],a[maxr][i]);
}if (a[k][c]==0)
for (i=k+1;i<=tot;i++)}}
for (i=k;i<=tot;i++)if (a[i][var+1])return -1;
if (k-1=1;i--)
for (j=i+1;j<=var;j++)
if (a[i][j]*x[j])x[i]^=x[j];
return 0;
}int main()
for (i=1;i<=5;i++)
for (j=1;j<=6;j++)
geta(i,j);
var=tot=30;
gauss();
printf("puzzle #%d\n",++cas);
for(i=1;i<=30;i++)}}
uva 11542 異或方程組
include include include include include includeusing namespace std const int maxn 500 10 const int maxp 100 int vis maxn int prime maxp int gen primes...
poj 1830 異或方程組
題意 有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應地發生變化,即這些相聯絡的開關的狀態如果原來為開就變為關,如果為關就變為開。你的目標是經過若干次開關操作後使得最後n個開關達到乙個特定的狀態。對於任意乙個開關,最多只能進行一次開...
POJ1830 開關問題(異或方程組)
本作品採用知識共享署名 相同方式共享 4.0 國際許可協議進行許可。有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應地發生變化,即這些相聯絡的開關的狀態如果原來為開就變為關,如果為關就變為開。你的目標是經過若干次開關操作後使得最後n...