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 Scala (judge verdict: Accepted)

import scala.io.StdIn.{readInt,readLine}

object Main {

  def gcd(x:Long, y:Long):Long = if(y==0) x else gcd(y, x%y)
  def lcm(x:Long, y:Long) = (x/gcd(x,y))*y
        def pow(x:Long, y:Long, z:Long):Long = {
                def multi(m:Long, n:Long) = { ( (m%z) * (n%z) ) % z }

                def scan(m:Long, n:Long, odd:Long, b:Long):Long = {
                        n match {
                                case 0 => 1
                                case 1 => multi(m, odd)
                                case _ =>
                                        scan(multi(m,m), n/2, (if(n%2==1) multi(odd, b) else odd), multi(b,b))
                        }
                }
                scan(x, y, 1, x)
        }

  def main(args:Array[String]) = {
    Iterator.continually(readLine).takeWhile(_.trim!="0 0 0 0 0 0").foreach { s =>
      val n = s.split(" ").map(_.toLong)
      val a1 = n(0);val m1 = n(1);val a2 = n(2);val m2 = n(3);val a3 = n(4);val m3 = n(5)
      val i1 = Stream.from(1).find(pow(a1,_,m1)==1).getOrElse(0)
      val i2 = Stream.from(1).find(pow(a2,_,m2)==1).getOrElse(0)
      val i3 = Stream.from(1).find(pow(a3,_,m3)==1).getOrElse(0)
      println(lcm(i1,lcm(i2,i3)))
    }
  }
}