Sasha grew up and went to first grade. To celebrate this event her mother bought her a multiplication table M with n rows and n columns such that M_{ij}=a_i ⋅ a_j where a_1, ..., a_n is some sequence of positive integers.

Of course, the girl decided to take it to school with her. But while she was having lunch, hooligan Grisha erased numbers on the main diagonal and threw away the array a_1, ..., a_n. Help Sasha restore the array!

Input

The first line contains a single integer n (3 ⩽ n ⩽ 10^3), the size of the table. 

The next n lines contain n integers each. The j-th number of the i-th line contains the number M_{ij} (1 ≤ M_{ij} ≤ 10^9). The table has zeroes on the main diagonal, that is, M_{ii}=0.

Output

In a single line print n integers, the original array a_1, ..., a_n (1 ≤ a_i ≤ 10^9). It is guaranteed that an answer exists. If there are multiple answers, print any.

Examples

Input


5
0 4 6 2 4
4 0 6 2 4
6 6 0 3 6
2 2 3 0 2
4 4 6 2 0


Output


2 2 3 1 2 

Input


3
0 99990000 99970002
99990000 0 99980000
99970002 99980000 0


Output


9999 10000 9998 
import java.util.*;
import java.io.*;
 
public class tr0 {
	static PrintWriter out;
	static StringBuilder sb;
	static final double EPS = 1e-9;
	static long mod = (int) 1e9 + 7;
	static int inf = (int) 1e9 + 2;
	static long[] fac;
	static int[] si;
	static ArrayList<Integer> primes;
	static ArrayList<Integer>[] ad;
	static ArrayList<pair>[] d;
	static edge[] ed;
	static boolean []vis;
	static int n, m;
	static int[] l, ch;
	static int[] occ;
	static Queue<Integer>[] can;
	static String s;
 
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		out = new PrintWriter(System.out);
		int n=sc.nextInt();
		long [][]a=new long [n][n];
		long []ans=new long [n];
		long gcd=0;
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				a[i][j]=sc.nextInt();
		for(int i=0;i<n;i++)
			gcd=gcd(gcd, a[0][i]);
		
		TreeSet<Long> tr=new TreeSet<>();
		tr.add(gcd);
		for(long i=1;i*i<=gcd;i++) {
			if(gcd%i!=0)
				continue;
			tr.add(i);
			tr.add(gcd/i);
		}
	//	System.out.println(tr);
		for(long u:tr) {
			ans[0]=u;
			for(int i=1;i<n;i++)
				ans[i]=a[0][i]/u;
			boolean t=true;
	k:		for(int o=0;o<n;o++) {
				for(int oo=o+1;oo<n;oo++) {
					if(a[o][oo]!=ans[o]*ans[oo]) {
						t=false;
						break k;
					}
				}
			}
			if(t)
				break;
		}
		for(int i=0;i<n;i++)
			out.print(ans[i]+" ");
		out.close();
	}
	static int se;
	static TreeSet<Integer> trr;
    static void dfs(int v) {
    	se++;
    	vis[v]=true;
    	for(int d:ad[v])
    		if(!vis[d])
    			dfs(d);
    }
	static class qu {
		int node,tybe;
 
		qu(int a, int s) {
			node=a;
			tybe=s;
		}
 
	}
 
	static double modPow(double a, int e)
 
	{
		double res = 1;
		while (e > 0) {
			if ((e & 1) == 1)
				res = (res * a);
			a = (a * a);
			e >>= 1;
		}
		return res;
	}
 
	static class pair {
		int to;
		int number;
 
		pair(int t, int n) {
			number = n;
			to = t;
		}
 
		public String toString() {
			return to + " " + number;
		}
	}
 
	static boolean[] in;
 
	/*
	 * static void mst() { Arrays.sort(ed); UnionFind uf=new UnionFind(n); for(int
	 * i=0;i<m;i++) { edge w=ed[i]; if(!uf.union(w.from, w.to)) continue;
	 * in[i]=true; } }
	 */
	static class edge implements Comparable<edge> {
		int from;
		int to;
		int number;
 
		edge(int f, int t, int n) {
			from = f;
			to = t;
			number = n;
		}
 
		public String toString() {
			return from + " " + to + " " + number;
		}
 
		public int compareTo(edge f) {
			return number - f.number;
		}
	}
 
	static class seg implements Comparable<seg> {
		int a;
		int b;
 
		seg(int s, int e) {
			a = s;
			b = e;
		}
 
		public String toString() {
			return a + " " + b;
		}
 
		public int compareTo(seg o) {
			// if(a==o.a)
			return o.b - b;
			// return
		}
	}
 
	static long power(int i) {
		// if(i==0)
		// return 1;
		long a = 1;
		for (int k = 0; k < i; k++)
			a *= i;
		return a;
	}
 
	static void seive() {
		si = new int[1000001];
		primes = new ArrayList<>();
		int N = 1000001;
		si[1] = 1;
		for (int i = 2; i < N; i++) {
			if (si[i] == 0) {
				si[i] = i;
				primes.add(i);
			}
			for (int j = 0; j < primes.size() && primes.get(j) <= si[i] && (i * primes.get(j)) < N; j++)
				si[primes.get(j) * i] = primes.get(j);
 
		}
	}
 
	static long inver(long x) {
		int a = (int) x;
		long e = (mod - 2);
		long res = 1;
		while (e > 0) {
			if ((e & 1) == 1) {
				// System.out.println(res*a);
				res = (int) ((1l * res * a) % mod);
			}
			a = (int) ((1l * a * a) % mod);
			e >>= 1;
		}
		// out.println(res+" "+x);
		return res % mod;
	}
 
	static long fac(int n) {
		if (n == 0)
			return fac[n] = 1;
		if (n == 1)
			return fac[n] = 1;
		long ans = 1;
		for (int i = 1; i <= n; i++)
			fac[i] = ans = (i % mod * ans % mod) % mod;
		return ans % mod;
	}
 
	static long gcd(long a, long b) {
 
		if (b == 0)
			return a;
		return gcd(b, a % b);
	}
 
	static class unionfind {
		int[] p;
		int[] size;
 
		unionfind(int n) {
			p = new int[n];
			size = new int[n];
 
			for (int i = 0; i < n; i++) {
				p[i] = i;
			}
			Arrays.fill(size, 1);
		}
 
		int findSet(int v) {
			if (v == p[v])
				return v;
			return p[v] = findSet(p[v]);
		}
 
		boolean sameSet(int a, int b) {
			a = findSet(a);
			b = findSet(b);
			if (a == b)
				return true;
			return false;
		}
 
		int max() {
			int max = 0;
			for (int i = 0; i < size.length; i++)
				if (size[i] > max)
					max = size[i];
			return max;
		}
 
		boolean combine(int a, int b) {
			a = findSet(a);
			b = findSet(b);
			if (a == b)
				return true;
			if (size[a] > size[b]) {
				p[b] = a;
				size[a] += size[b];
 
			} else {
				p[a] = b;
				size[b] += size[a];
			}
			return false;
		}
	}
 
	static class Scanner {
		StringTokenizer st;
		BufferedReader br;
 
		public Scanner(InputStream system) {
			br = new BufferedReader(new InputStreamReader(system));
		}
 
		public Scanner(String file) throws Exception {
			br = new BufferedReader(new FileReader(file));
		}
 
		public String next() throws IOException {
			while (st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}
 
		public String nextLine() throws IOException {
			return br.readLine();
		}
 
		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}
 
		public double nextDouble() throws IOException {
			return Double.parseDouble(next());
		}
 
		public char nextChar() throws IOException {
			return next().charAt(0);
		}
 
		public Long nextLong() throws IOException {
			return Long.parseLong(next());
		}
 
		public boolean ready() throws IOException {
			return br.ready();
		}
 
		public void waitForInput() throws InterruptedException {
			Thread.sleep(3000);
		}
	}
}