/*
ID: thestor1
LANG: C++
TASK: ratios
*/
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cassert>
#include <string>
#include <algorithm>
using namespace std;
int gcd(int a, int b)
{
if(b == 0)
{
return a;
}
return gcd(b, a % b);
}
const int large = 1000000;
int main()
{
FILE *fin = fopen ("ratios.in", "r");
FILE *fout = fopen ("ratios.out", "w");
//freopen("log.txt", "w", stdout);
double matrix[3][4];
fscanf(fin, "%lf %lf %lf", &matrix[0][3], &matrix[1][3], &matrix[2][3]);
for(int i = 0; i < 3; ++i)
{
fscanf(fin, "%lf %lf %lf", &matrix[0][i], &matrix[1][i], &matrix[2][i]);
}
/*
fprintf(stdout, "matrix:\n");
for(int i = 0; i < 3; ++i)
{
for(int j = 0; j <= 3; ++j)
{
fprintf(stdout, "%8.4lf\t", matrix[i][j]);
}
fprintf(stdout, "\n");
}
*/
for(int c = 0; c < 3; ++c)
{
assert(matrix[c][c] != 0);
double coef = matrix[c][c];
for(int j = c; j <= 3; ++j)
{
matrix[c][j] /= coef;
}
for(int i = 0; i < 3; ++i)
{
if(i == c)
{
continue;
}
coef = matrix[i][c];
for(int j = c; j <= 3; ++j)
{
matrix[i][j] -= coef * matrix[c][j];
}
}
/*
fprintf(stdout, "matrix:\n");
for(int i = 0; i < 3; ++i)
{
for(int j = 0; j <= 3; ++j)
{
fprintf(stdout, "%8.4lf\t", matrix[i][j]);
}
fprintf(stdout, "\n");
}
*/
}
for(int n = 1; n <= 100; ++n)
{
int i;
for(i = 0; i < 3; ++i)
{
double d = matrix[i][3] * n;
if(abs((double)((int)(d + 0.5) - d)) > 0.0001)
{
break;
}
}
if(i >= 3)
{
int i1 = (int)(matrix[0][3] * n + 0.5);
int i2 = (int)(matrix[1][3] * n + 0.5);
int i3 = (int)(matrix[2][3] * n + 0.5);
fprintf(fout, "%d %d %d %d\n", i1, i2, i3, n);
return 0;
}
}
fprintf(fout, "NONE\n");
return 0;
}
刚开始想用linear programming中的simplex算法。苦于半天无法下手写程序,且不能确定能求出整数解。于是转为高斯消元,然后搜索1~100能使三个系数都成为整数的最小倍数。
代码前面高斯消元我比较清楚,后面测试的部分是根据题目给的样例猜的,竟然所有的测试点都过了。。。仍然不知所以然。。。