AOJ - Problem 0114 : Electro-Fly

x,y,zがそれぞれ何回で1に戻ってくるか計算し、その回数をa,b,cとするとa,b,cの最小公倍数が答えになるようです。long int(32bit)ではオーバーフローするので注意が必要です。

#include <iostream>
using namespace std;

typedef long long int ll;

ll gcd(ll a, ll b){
	return (b > 0)? gcd( b , a%b ) : a ;
}

ll lcm(ll a, ll b){
	return a / gcd(a,b) * b;
}

int main(){
	ll a1, a2, a3, m1, m2, m3;
	while( cin >> a1 >> m1 >> a2 >> m2 >> a3 >> m3 , a1||m1||a2||m2||a3||m3 ){
		ll x, y, z, a, b, c;
		a = b = c = x = y = z = 1;
		x = (x * a1) % m1;
		y = (y * a2) % m2;
		z = (z * a3) % m3;
		for( ; x != 1 ; a++ ){
			x = (x * a1) % m1;
		}
		for( ; y != 1 ; b++ ){
			y = (y * a2) % m2;
		}
		for( ; z != 1 ; c++ ){
			z = (z * a3) % m3;
		}
		ll ans = lcm( lcm(a,b) , c);
		cout << ans << endl;
	}
}