rt,本质上是想调矩阵求逆
如果你成功了你将获得题目描述中纯情女高 lzy 的 qq。
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define eps (1e-7)
using namespace std;
const int MAXN = 105;
int n;
class Matrix {
private :
double a[MAXN][MAXN];
public :
int n, m;
inline double &operator () (const int &x, const int &y) {
return a[x][y];
}
inline void Init(int x, int y) {
n = x, m = y;
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= m; ++ j)
a[i][j] = 0;
}
inline void Unit() {
for (int i = 1; i <= n; ++ i)
a[i][i] = 1;
}
inline Matrix operator * (Matrix B) {
Matrix C; C.Init(n, B.m);
for (int i = 1; i <= n; ++ i)
for (int k = 1; k <= m; ++ k)
for (int j = 1; j <= B.m; ++ j)
C(i, j) += a[i][k] * B(k, j);
return C;
}
inline void Output() {
puts("-------------------------");
printf ("%d %d\n", n, m);
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= m; ++ j)
printf ("%lf ", a[i][j]);
puts("");
}
puts("-------------------------");
}
}ans, d, inv;
inline Matrix fsp(Matrix x, int p) {
Matrix res;
res.Init(x.n, x.m); res.Unit();
for (; p; p >>= 1) {
if (p & 1) res = res * x;
x = x * x;
}
return res;
}
inline Matrix Get_inv(Matrix x) {
Matrix res; int n = x.n, m = x.m;
res.Init(n, m); res.Unit();
for (int i = 1; i <= n; ++ i) {
for (int j = i; j <= n; ++ j)
if (abs(x(j, i)) > eps) {
for (int k = 1; k <= n; ++ k)
swap(x(i, k), x(j, k)),
swap(res(i, k), res(j, k));
break;
}
if (abs(x(i, i) < eps)) {
puts("No Solution"); exit(0);
}
double div = x(i, i);
for (int k = i; k <= m; ++ k)
x(i, k) /= div, res(i, k) /= div;
for (int j = 1; j <= n; ++ j) {
if (i == j) continue;
div = x(j, i);
for (int k = i; k <= n; ++ k)
x(j, k) -= x(i, k) * div,
res(j, k) -= res(i, k) * div;
}
}
return res;
}
int main()
{
scanf ("%d", &n);
d.Init(n, n); ans.Init(n, 1);
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j)
scanf ("%lf", &d(i, j));
scanf ("%lf", &ans(i, 1));
}
inv = Get_inv(d);
// inv.Output();
ans = inv * ans;
// inv = d * inv;
// inv.Output();
for (int i = 1; i <= n; ++ i)
printf ("%.2lf\n", ans(i, 1));
return 0;
}