依舊是跟著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的個數 無解的話去...