链接:HIHO 1195
题解:额, hihocoder给的提示已经很详细了, 转成上三角矩阵, 这题是不需要考虑浮点解得, 需要考虑浮点解的题目
应该是需要求LCM的。。。
code:
//adrui's submission
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define debug 0
#define eps 1e-6
#define M(a, b) memset(a, b, sizeof(a))
const int maxn = 1000 + 5;
double a[maxn][maxn], ans[maxn];
int n, m;
int f[maxn];
int Gauss()
{
M(f, 0);
for(int i = 1; i <= n; i++)
{
int r = i;
for(int j = i; j <= m; j++)
{
if(fabs(a[j][i]) > fabs(a[r][i]))
{
r = j;
}
}
if(r == i && fabs(a[i][i]) < eps)
{
return -1;
}
if(r != i)
swap(a[r], a[i]);
for(int j = i + 1; j <= m; j++)
{
double tmp = a[j][i] / a[i][i];
for(int k = n + 1; k > i; k--)
a[j][k] -= tmp * a[i][k];
a[j][i] = 0;
}
}
int j;
for(int i = n; i <= m; i++)
{
for(j = 1; j <= n; j++)
if(fabs(a[i][j])>1e-6)
break;
if(j == n + 1 && fabs(a[i][n + 1])>1e-6)
return 0;
}
for(int i = n; i > 0; i--)
{
for(j = i + 1; j <= n; j++)
a[i][n + 1] -= a[i][j] * ans[j];
ans[i] = a[i][n + 1]/a[i][i];
}
return 1;
}
int main()
{
#if debug
freopen("in.txt", "r", stdin);
#endif // debug
while(~scanf("%d%d", &n, &m))
{
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n + 1; j++)
scanf("%lf", &a[i][j]);
/*for(int i = 1; i <= m; i++)
for(int j = 1; j <= n + 1; j++)
printf("%3d", (int)a[i][j]);*/
int res = Gauss();
if(!res)
puts("No solutions");
else
{
if( res == -1)
{
puts("Many solutions");
}
else
{
for(int i = 1; i <= n; i++)
printf("%d\n", (int)(ans[i] + 0.5));
}
}
}
return 0;
}