Problem:
電子蝿

ある計算機学者が電子空間に棲息する電子蝿という奇妙な生命体を見つけました。電子蝿の行動を観察しているうちに、この空間の (x, y, z) 地点にいる電子蝿は、次に以下の規則で示される (x', y', z')に移動することが分かりました。

ただし、a1, m1, a2, m2, a3, m3 は電子蝿の個体ごとに定まる正の整数です。A mod B は正の整数 A を正の整数 B で割ったときの余りです。

さらに観察をすると、ある種の電子蝿は (1,1,1) に置いてからしばらくすると、必ず (1,1,1) に戻ってくることがわかりました。このような蝿を戻り蝿と名付けました(1) 。

戻り蝿のデータを入力とし、(1,1,1) に戻ってくる最小の移動回数 (>0) を出力するプログラムを作成してください。なお 1< a1, m1, a2, m2, a3, m3 < 215 とします。

(1) a1 と m1, a2 と m2, a3 と m3 がそれぞれ互いに素 (公約数が 1) である時に戻ります。

Input

複数のデータセットが与えられます。各データセットは以下の形式で与えられます。

a1 m1 a2 m2 a3 m3

入力は６つの 0 を含む行で終わります。データセットの数は 50 を超えません。

Output

各データセットごとに、(1,1,1) に戻ってくる最小の移動回数(整数)を１行に出力してください。

Sample Input

2 5 3 7 6 13
517 1024 746 6561 4303 3125
0 0 0 0 0 0

Output for the Sample Input

12
116640000

Solution in C (judge verdict: Accepted)

#include <stdio.h>
long long int gcd( long long int a, long long int b )
{
	if ( a%b == 0 ) {
		return b;
	} else {
		return gcd( b, a%b );
	}
}

long long int lcm( long long int a, long long int b )
{
	return ( a*b ) / gcd( a, b );
}
int main()
{
	long long int x=1, y=1, z=1;
	long long int a1, a2, a3;
	long long int m1, m2, m3;
	long long int cnt1 = 0, cnt2 = 0, cnt3 = 0;

	while ( scanf( "%llu %llu %llu %llu %llu %llu", &a1, &m1, &a2, &m2, &a3, &m3 ) == 6 ) {
		if ( a1 == 0 && m1 == 0 && a2 == 0 && m2 == 0 && a3 == 0 && m3 == 0 ) { break; }

		cnt1 = 0, cnt2 =0, cnt3 = 0;
		x = y = z = 1;
		// x1, y1, z1が同時に1になる場合を探索するとTLEするため, 
		// 個別に1となる回数をカウントしたのち, それぞれのカウントの
		// 最小公倍数を求める.
		while ( 1 ) {
			x = ( a1 * x ) % m1;
			cnt1++;	
			if ( x == 1 ) { break; }
		}
		while ( 1 ) {
			y = ( a2 * y ) % m2;
			cnt2++;
			if ( y == 1 ) { break; }
		}
		while ( 1 ) {
			z = ( a3 * z ) % m3;
			cnt3++;
			if ( z == 1 ) { break; }
		}
		printf( "%llu\n", lcm( lcm( cnt1, cnt2 ), cnt3 ) );
	}

	return 0;
}