萌新 16 妹子 165 90 斤人美声甜求调悬 qq
  • 板块灌水区
  • 楼主haochengw920
  • 当前回复7
  • 已保存回复9
  • 发布时间2024/6/3 16:16
  • 上次更新2024/6/3 19:28:12
查看原帖
萌新 16 妹子 165 90 斤人美声甜求调悬 qq
563650
haochengw920楼主2024/6/3 16:16

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;
}
2024/6/3 16:16
加载中...