论暴力解方程
高斯消元
原理就是跟我们普通解方程组一样,还要暴力些。
代码实现,你想怎么暴力就怎么暴力,n³暴力打出来就是高斯消元了。
先放模板:
bzoj1013 球形空间产生器
1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 5 const int N = 20; 6 const double eps = 1e-10; 7 8 double a[N][N], b[N][N], sum[N]; 9 int n; 10 11 inline void out() { 12 printf("\n"); 13 for(int i = 1; i <= n; i++) { 14 for(int j = 1; j <= n + 1; j++) { 15 printf("%.2lf ", a[i][j]); 16 } 17 puts(""); 18 } 19 puts(""); 20 return; 21 } 22 23 inline void Gauss() { 24 for(int i = 1; i < n; i++) { /// lie 25 int j = i; 26 while(j <= n && fabs(a[j][i]) < eps) { 27 j++; 28 } 29 if(j != i) { 30 std::swap(a[i], a[j]); 31 } 32 for(int j = i + 1; j <= n; j++) { /// hang 33 double k = a[j][i] / a[i][i];/// a * k = b k = b / a; 34 for(int p = i; p <= n + 1; p++) { 35 a[j][p] -= k * a[i][p]; 36 } 37 } 38 } 39 for(int i = n; i > 1; i--) { /// lie 40 for(int j = i - 1; j >= 1; j--) { /// hang 41 double k = a[j][i] / a[i][i]; 42 a[j][i] -= a[i][i] * k; 43 a[j][n + 1] -= a[i][n + 1] * k; 44 } 45 } 46 return; 47 } 48 49 int main() { 50 scanf("%d", &n); 51 for(int i = 1; i <= n + 1; i++) { 52 for(int j = 1; j <= n; j++) { 53 scanf("%lf", &b[i][j]); 54 } 55 } 56 57 for(int i = 1; i <= n; i++) { 58 for(int j = 1; j <= n; j++) { 59 a[i][j] = b[i + 1][j] - b[i][j]; 60 sum[i] += b[i][j] * b[i][j]; 61 } 62 a[i - 1][n + 1] = sum[i] - sum[i - 1]; 63 } 64 for(int i = 1; i <= n; i++) { 65 sum[n + 1] += b[n + 1][i] * b[n + 1][i]; /// b --> a 66 } 67 a[n][n + 1] = sum[n + 1] - sum[n]; 68 69 Gauss(); 70 for(int i = 1; i <= n; i++) { 71 printf("%.3lf ", a[i][n + 1] / a[i][i] / 2); 72 } 73 74 return 0; 75 }
这个模板是对的,但是最后输出 / 2 是因为我一开始把平方公式记错了,少了个2......
一般有什么用呢?
1,遇到解方程裸题,不用多说,可以解%意义下的方程,乘逆元/辗转相减 即可。
2,解异或方程组。例题
3,求解一些互相关联的值,如期望,DP等。