OI中的线性代数
高斯消元法
用于求解线性方程组:
- 选择主元并系数化为1
- 向下步骤:向下消元
- 向上步骤:向上消元
#include <bits/stdc++.h>
using namespace std;
#define FR freopen("in.txt", "r", stdin)
#define FW freopen("out.txt", "w", stdout)
#define MOD 998244353
typedef long long ll;
double matrix[105][105];
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= n; j++)
{
scanf("%lf", &matrix[i][j]);
}
}
for (int r = 0; r < n; r++)
{
int domain = 0;
while (matrix[r][domain] == 0 && domain < n)
domain++;
if (domain == n)
{
printf("No Solution");
return 0;
}
// to 1
for (int j = n; j >= domain; j--)
{
matrix[r][j] /= matrix[r][domain];
}
// down
for (int l = r + 1; l < n; l++)
{
if (matrix[l][domain] != 0)
{
for (int j = n; j >= domain; j--)
{
matrix[l][j] -= matrix[r][j] * matrix[l][domain];
}
}
}
// up
for (int l = r - 1; l >= 0; l--)
{
if (matrix[l][domain] != 0)
{
for (int j = n; j >= domain; j--)
{
matrix[l][j] -= matrix[r][j] * matrix[l][domain];
}
}
}
}
for (int r = 0; r < n; r++)
{
printf("%.2lf\n", matrix[r][n]);
}
return 0;
}
矩阵相乘计数
一般我们定义初始矩阵 A A A,计数矩阵 B B B,那么我们做 n n n次变换的结果就是 B n A B^nA BnA。
我们定义矩阵 A i j n A^n_{ij} Aijn为从 j j j到 i i i的 n n n次传递的方案数。那么我们,可以定义 B i j B_{ij} Bij,如果 j j j到 i i i可达为 1 1 1,不可达为 0 0 0。