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;
      }
  }
  
  
  