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)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();

            while (true)
            {
                int[] input = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);

                if (input.All(n => n == 0)) break;

                int a1 = input[0], m1 = input[1];
                int a2 = input[2], m2 = input[3];
                int a3 = input[4], m3 = input[5];

                long cntX = ReturnCount(a1, m1);
                long cntY = ReturnCount(a2, m2);
                long cntZ = ReturnCount(a3, m3);

                long lcm;
                lcm = cntX * cntY / GCD(cntX, cntY);
                lcm = cntZ * lcm / GCD(cntZ, lcm);

                sb.AppendLine(lcm.ToString());
            }
            Console.Write(sb);
        }

        static int ReturnCount(int a, int m)
        {
            int pos = 1, cnt = 0;

            do
            {
                pos = (a * pos) % m;
                cnt++;

            } while (pos != 1);

            return cnt;
        }

        static long GCD(long n1, long n2)
        {
            long x = Math.Max(n1, n2);
            long y = Math.Min(n1, n2);
            long r = x % y;

            while (r != 0)
            {
                x = y;
                y = r;
                r = x % y;
            }
            return y;
        }
    }
}