Problem:
みんなでジョギング

赤ベコ小学校では、生徒全員が参加する、ちょっと変わったジョギングをします。生徒は、それぞれ独自の周回コースを、自分のペースで走ります。それぞれ自分のコースを 1 周すると小学校に戻ってきます。全員が小学校を同時にスタートしてから、全員が同時に小学校で最初に出会うのは、それぞれ何周したときでしょうか?

生徒の人数 n、各生徒のコースの 1 周の距離 d (km) 、各生徒の走る速さ v (km/時間)を入力とし、全員が小学校を同時にスタートしてから次に同時に小学校に位置するのは、各生徒がそれぞれ何周したときかを出力するプログラムを作成してください。なお、各生徒は 231-1 周を超えて走ることはありません。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

n
d1 v1
d2 v2
:
dn vn

1 行目に生徒の人数 n (2 ≤ n ≤ 10) が与えられます。続く n 行に i 人目の生徒のコースの１周の距離 di (1 ≤ di ≤ 10000) と走る速さ vi (1 ≤ vi ≤ 10000) が与えられます。

データセットの数は 2000 を超えません。

Output

入力データセットごとに、各生徒の周回数を出力します。各生徒の周回数は入力の順番に従ってそれぞれ１行に出力してください。

Sample Input

2
4 3
5 4
5
789 289
166 46
9 4
617 252
972 303
2
8 5
32 20
0

Output for the Sample Input

15
16
1598397732
1209243492
1939462992
1782294192
1360317793
1
1

Solution in JAVA (judge verdict: Accepted)

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	MyScanner sc = new MyScanner();
	Scanner sc2 = new Scanner(System.in);
	int mod = 1000000007;

	void run() {
		for (;;) {
			int n = sc2.nextInt();
			if (n == 0) {
				return;
			}
			BigInteger[][] info = new BigInteger[n][2];
			for (int i = 0; i < n; i++) {
				info[i][0] = new BigInteger(sc2.next());
				info[i][1] = new BigInteger(sc2.next());

				BigInteger div = info[i][0].gcd(info[i][1]);
				info[i][0] = info[i][0].divide(div);
				info[i][1] = info[i][1].divide(div);
			}
			BigInteger gcd = info[0][1].gcd(info[1][1]);
			BigInteger lcm = info[0][1].multiply(info[1][1]).divide(gcd);
			for (int i = 2; i < n; i++) {
				gcd = lcm.gcd(info[i][1]);
				lcm = lcm.divide(gcd).multiply(info[i][1]);
			}
			for (int i = 0; i < n; i++) {
				info[i][0] = info[i][0].multiply(lcm).divide(info[i][1]);
				info[i][1] = lcm;
			}
			gcd = info[0][0].gcd(info[1][0]);
			lcm = info[0][0].divide(gcd).multiply(info[1][0]);
			for (int i = 2; i < n; i++) {
				gcd = lcm.gcd(info[i][0]);
				lcm = lcm.divide(gcd).multiply(info[i][0]);
			}
			for (BigInteger[] out : info) {
				System.out.println(lcm.divide(out[0]));
			}
		}
	}

	long gcd(long a, long b) {
		return a % b == 0 ? b : gcd(b, a % b);
	}

	public static void main(String[] args) {
		new Main().run();
	}

	void debug(Object... o) {
		System.out.println(Arrays.deepToString(o));
	}

	void debug2(int[][] array) {
		for (int i = 0; i < array.length; i++) {
			for (int j = 0; j < array[i].length; j++) {
				System.out.print(array[i][j]);
			}
			System.out.println();
		}
	}

	class MyScanner {
		int nextInt() {
			try {
				int c = System.in.read();
				while (c != '-' && (c < '0' || '9' < c))
					c = System.in.read();
				if (c == '-')
					return -nextInt();
				int res = 0;
				do {
					res *= 10;
					res += c - '0';
					c = System.in.read();
				} while ('0' <= c && c <= '9');
				return res;
			} catch (Exception e) {
				return -1;
			}
		}

		double nextDouble() {
			return Double.parseDouble(next());
		}

		String next() {
			try {
				StringBuilder res = new StringBuilder("");
				int c = System.in.read();
				while (Character.isWhitespace(c))
					c = System.in.read();
				do {
					res.append((char) c);
				} while (!Character.isWhitespace(c = System.in.read()));
				return res.toString();
			} catch (Exception e) {
				return null;
			}
		}
	}
}