高斯消元小結(貼一些模板)

2022-08-05 18:12:19 字數 2697 閱讀 2249

依舊是跟著hihocoder學習高斯消元,以前只是知道,並不會寫,現在感覺寫起來還是比較簡單的,其實就是乙個線性代數的知識。(我記得今年好像做到過一道高斯消元的題,比較隱蔽的方程組,然後隊友最後想到了,然而並沒有時間寫完,結束以後也並沒有補一下高斯消元)。

高斯消元關鍵就是乙個倒三角形吧,然後判斷是無窮解,無解,唯一解的的條件就是矩陣的秩與n(元的個數)的關係:

n元方程組 ax = b 解的情況和r(a),r(a,b),n有關。

無解: r(a) < r(a,b)

唯一解:r(a) == r(a,b) == n

無窮解:r(a) == r(a,b) < n

具體實現方法可以看程式,(然而我覺得hihocoder的偽**寫得很不錯)。

然後是異或方程組,這裡有乙個很重要的異或公式 a xor b == c 等價於 b == a xor c,其實這裡很好理解。

異或方程可以表示為 初始狀態 xor (a[i][1] * x[1]) xor (a[i][2] * x[2]) xor ... xor (a[i][n]*x[n]) == c[i] 這個時候可以轉化成:(a[i][1] * x[1]) xor (a[i][2] * x[2]) xor ... xor (a[i][n]*x[n]) == c[i] xor 初始狀態。搞定

異或方程組的消元是利用了 1^1 == 0來做的,但是這個消元的時候要注意,1^0 == 1,也就是在消元的時候不能呆頭呆腦地直接搞,遇到這個a[j][i] == 0了,直接跳過就好了。

下面貼一下模板:

高斯消元:

#include #include #include #include #include #include #include #include #define for(i,x,y)  for(int i = x;i < y;i ++)

#define ifor(i,x,y) for(int i = x;i > y;i --)

#define ll long long

#define n 550

#define m 1100

using namespace std;

const double eps = 1e-6;

int n,m;

double a[m][n],c[m],b[n],val[n];

bool zero(double x)

void swap(int i,int j)

double tem = c[i];

c[i] = c[j];

c[j] = tem;

}int guass()

}if(!flag)

for(j,i+1,m+1)

c[j] = c[j] - c[i]*tem;}}

for(i,1,m+1)

}if(flag && !zero(c[i]))

}if(manysolution)

return 1;

ifor(i,n,0)

c[j] = c[j] - c[i]*tem;

}val[i] = c[i]/a[i][i];

}return 0;

}int main()

int tem = guass();

if(tem == -1) printf("no solutions\n");

else if(tem == 1) printf("many solutions\n");

else}}

return 0;

}

異或方程組:

#include #include #include #include #include #include #include #define ll long long

#define for(i,x,y) for(int i = x;i < y;i ++)

#define ifor(i,x,y) for(int i = x;i > y;i --)

#define n 35

using namespace std;

const double eps = 1e-6;

char str[10];

int a[n][n],c[n],val[n],ans[n];

void init()

}void swap(int i,int j)

int tem = c[i];

c[i] = c[j];

c[j] = tem;

}int guass()

}for(j,i+1,30)

c[j] = c[i] ^ c[j];

}if(!flag)

}for(i,0,30)

if(flag && c[i]) return -1;

}if(manysolutions) return 1;

ifor(i,29,-1)

c[j] = c[j] ^ c[i];

}val[i] = c[i];

}return 0;

}int main()

for(i,1,5)

}memset(val,0,sizeof(val));

init();

guass();

int cnt = 0;

for(i,0,30)

printf("%d\n",cnt);

for(i,0,cnt)

}return 0;

}

小結 高斯消元

對於一組多項式方程 增廣矩陣中,x i,n 1 表示式子的值 x i,j 表示第i個方程第j項的係數,在這裡,增廣矩陣可能不一定是n個,可能多可能少 opt表示運算規則 x 1,1 a 1 opt x 1,2 a 2 opt opt x 1,n a n x 1,n 1 x 2,1 a 1 opt x...

高斯消元模板

include include include include include include include include typedef long long ll const int n 1008 高斯消元模板 const double eps 1e 12 double aug n n 增廣矩...

高斯消元模板

用迭代的辦法打會簡潔一些。有些精度上的細節需要注意。多次消元要清空use和cho陣列。實數高斯消元 int use maxn cho maxn void solve equation int n,int m break fd i,n,1 if cho i 自由元的個數就是cho為0的個數 無解的話去...