source_code: import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.io.PrintWriter;
  import java.io.StreamTokenizer;
  import java.util.Arrays;
  import java.util.Locale;
  
  public class E16 {
  
  	static StreamTokenizer in;
  	static PrintWriter out;
  	
  	static int nextInt() throws IOException {
  		in.nextToken();
  		return (int)in.nval;
  	}
  	
  	static double nextDouble() throws IOException {
  		in.nextToken();
  		return in.nval;
  	}
  	
  	static String nextString() throws IOException {
  		in.nextToken();
  		return in.sval;
  	}
  
  	public static void main(String[] args) throws IOException {
  		in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  		out = new PrintWriter(System.out);
  		
  		n = nextInt();
  		t = 1 << n;
  		m = new double[n][n];
  		for (int i = 0; i < n; i++)
  			for (int j = 0; j < n; j++)
  				m[i][j] = nextDouble();
  		
  		memo = new double[t];
  		Arrays.fill(memo, Double.POSITIVE_INFINITY);
  		for (int i = 0; i < n; i++) out.print(String.format(Locale.US, "%.6f", solve(1 << i)) + " ");
  		out.println();
  		
  		out.flush();
  	}
  	
  	static int n, t;
  	static double[][] m;
  	static double[] memo;
  	
  	static double solve(int mask) {
  		if (memo[mask] != Double.POSITIVE_INFINITY) return memo[mask];
  		if (mask == t-1) return memo[mask] = 1;
  		
  		int k = Integer.bitCount(mask);
  		k = (k+1)*k/2;
  		double res = 0;
  		for (int i = 0; i < n; i++) if ((mask&(1 << i)) != 0)
  			for (int j = 0; j < n; j++) if ((mask&(1 << j)) == 0)
  				res += m[i][j]*solve(mask|(1 << j));
  		
  		return memo[mask] = res/k;
  	}
  }
  
  
  
  