h3mky0's blog

主に競プロについて書きます

AOJ0114 Electro-Fly

問題  電子蝿 | Aizu Online Judge



考察:

とりあえず x, y, zの各座標について1 -> 1になるまでの移動回数を求めたい

 x'= a_1x mod m_1に注目すると

(はじめは x=1

 x' = a_1xmodm_1

 x'' = a_1x'modm_1

...

といったように x再帰的に求められることがわかる. 

移動回数を求めるには木の深さを求める要領で x=1となるまで繰り返す

 

 x, y, zについて移動回数を求め, 最小公倍数を求めればよい

 

コード

#include <iostream>
using namespace std;
using ll = long long;

ll min_cost(ll n, ll a1, ll m1) { 
    if (n == 1) return 1; 
    return 1 + min_cost(n*a1%m1,a1, m1);
}
ll gcd(ll a, ll b) { 
    if (b == 0) return a; 
    return gcd(b, a%b);
}
int main() { 
    ll a1, m1, a2, m2, a3, m3; 
    while (cin >> a1 >> m1 >> a2 >> m2 >> a3 >> m3) { 
        if (a1 == 0 && m1 == 0 && a2 == 0 && m2 == 0 && a3 == 0 && m3 == 0) break;
        ll l1 = min_cost(a1%m1, a1, m1); 
        ll l2 = min_cost(a2%m2, a2, m2); 
        ll l3 = min_cost(a3%m3, a3, m3);
        ll L1 = l1/gcd(l1, l2)*l2;
        cout << L1 * l3 / gcd(L1, l3) << endl; 
    }
    return 0;
}