Pagini recente » Cod sursa (job #1475972) | Cod sursa (job #1479632) | Cod sursa (job #278971) | Cod sursa (job #986503) | Cod sursa (job #1759353)
import java.util.*;
import java.lang.*;
import java.io.*;
import java.math.*;
public class Main {
public static class Rational {
private final BigInteger num;
private final BigInteger denom;
public Rational(final BigInteger num, final BigInteger denom) {
final BigInteger gcd = num.gcd(denom);
this.num = num.divide(gcd);
this.denom = denom.divide(gcd);
}
public Rational(final long num, final long denom) {
this(BigInteger.valueOf(num), BigInteger.valueOf(denom));
}
public Rational(final long value) {
this(value, 1);
}
public Rational add(final Rational other) {
return new Rational(
num.multiply(other.denom).add(other.num.multiply(denom)),
denom.multiply(other.denom)
);
}
public Rational subtract(final Rational other) {
return new Rational(
num.multiply(other.denom).subtract(other.num.multiply(denom)),
denom.multiply(other.denom)
);
}
public Rational multiply(final Rational other) {
return new Rational(num.multiply(other.num), denom.multiply(other.denom));
}
public Rational multiply(final long other) {
return new Rational(num.multiply(BigInteger.valueOf(other)), denom);
}
public Rational divide(final Rational other) {
return new Rational(num.multiply(other.denom), denom.multiply(other.num));
}
public Rational divide(final long other) {
return new Rational(num, denom.multiply(BigInteger.valueOf(other)));
}
public BigDecimal toRealValue() {
return new BigDecimal(num).divide(new BigDecimal(denom), MathContext.DECIMAL128);
}
public boolean isZero() {
return num.compareTo(BigInteger.ZERO) == 0;
}
}
public static void main (String[] args) throws java.lang.Exception {
//InputReader in = new InputReader(new FileInputStream("gauss.in"));
//PrintWriter out = new PrintWriter(new FileOutputStream("gauss.out"));
InputReader in = new InputReader(System.in);
PrintWriter out = new PrintWriter(System.out);
int N = in.nextInt();
int M = in.nextInt();
Rational A[][] = new Rational[N][M + 1];
for (int i = 0; i < N; i++) {
for (int j = 0; j <= M; j++) {
int x = in.nextInt();
A[i][j] = new Rational(x);
}
}
int i = 0, j = 0;
while (i < N && j < M) {
int k = i;
while (k < N && A[k][j].isZero() == true) {
k++;
}
if (k != N) {
Rational tmp;
for (int iter = 0; iter <= M; iter++) {
tmp = A[k][iter];
A[k][iter] = A[i][iter];
A[i][iter] = tmp;
}
for (int iter = M; iter >= j; iter--) {
A[i][iter] = A[i][iter].divide(A[i][j]);
}
for (int iter = i + 1; iter < N; iter++) {
tmp = A[iter][j];
for (int column = j; column <= M; column++) {
A[iter][column] = A[iter][column].subtract(tmp.multiply(A[i][column]));
}
}
i++;
}
j++;
}
Rational[] answer = new Rational[M];
for (i = 0; i < M; i++) {
answer[i] = new Rational(0);
}
boolean impossibleSystem = false;
for (i = N - 1; i >= 0; i--) {
j = 0;
while (j <= M && A[i][j].isZero() == true) {
j++;
}
if (j == M) {
impossibleSystem = true;
break;
} else if (j < M) {
answer[j] = A[i][M];
for (int k = j + 1; k < M; k++) {
answer[j] = answer[j].subtract(answer[k].multiply(A[i][k]));
}
}
}
if (impossibleSystem == true) {
out.println("Imposibil");
} else {
for (i = 0; i < M; i++) {
out.print(answer[i].toRealValue().setScale(30));
out.print(' ');
}
out.print('\n');
}
out.close();
}
static class InputReader {
private InputStream stream;
private byte[] buf = new byte[2048];
private int curChar;
private int numChars;
public InputReader(InputStream stream) {
this.stream = stream;
}
public int read() {
if (numChars == -1)
throw new UnknownError();
if (curChar >= numChars) {
curChar = 0;
try {
numChars = stream.read(buf);
} catch (IOException e) {
throw new UnknownError();
}
if (numChars <= 0)
return -1;
}
return buf[curChar++];
}
public int peek() {
if (numChars == -1)
return -1;
if (curChar >= numChars) {
curChar = 0;
try {
numChars = stream.read(buf);
} catch (IOException e) {
return -1;
}
if (numChars <= 0)
return -1;
}
return buf[curChar];
}
public void skip(int x) {
while (x-- > 0)
read();
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
public String nextString() {
return next();
}
public String next() {
int c = read();
while (isSpaceChar(c))
c = read();
StringBuffer res = new StringBuffer();
do {
res.appendCodePoint(c);
c = read();
} while (!isSpaceChar(c));
return res.toString();
}
public String nextLine() {
StringBuffer buf = new StringBuffer();
int c = read();
while (c != '\n' && c != -1) {
if (c != '\r')
buf.appendCodePoint(c);
c = read();
}
return buf.toString();
}
public double nextDouble() {
int c = read();
while (isSpaceChar(c))
c = read();
int sgn = 1;
if (c == '-') {
sgn = -1;
c = read();
}
double res = 0;
while (!isSpaceChar(c) && c != '.') {
if (c == 'e' || c == 'E')
return res * Math.pow(10, nextInt());
if (c < '0' || c > '9')
throw new InputMismatchException();
res *= 10;
res += c - '0';
c = read();
}
if (c == '.') {
c = read();
double m = 1;
while (!isSpaceChar(c)) {
if (c == 'e' || c == 'E')
return res * Math.pow(10, nextInt());
if (c < '0' || c > '9')
throw new InputMismatchException();
m /= 10;
res += (c - '0') * m;
c = read();
}
}
return res * sgn;
}
public boolean hasNext() {
int value;
while (isSpaceChar(value = peek()) && value != -1)
read();
return value != -1;
}
private boolean isSpaceChar(int c) {
return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
}
}
}