论暴力解方程

高斯消元

原理就是跟我们普通解方程组一样,还要暴力些。

代码实现,你想怎么暴力就怎么暴力,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 }
AC代码

这个模板是对的,但是最后输出 / 2 是因为我一开始把平方公式记错了,少了个2......

一般有什么用呢?

1,遇到解方程裸题,不用多说,可以解%意义下的方程,乘逆元/辗转相减 即可。

2,解异或方程组。例题

3,求解一些互相关联的值,如期望,DP等。

 

posted @ 2018-07-13 16:54  garage  阅读(262)  评论(0编辑  收藏  举报