Codeforces 371(#218 Div2 only) B. Fox Dividing Cheese
問題
二数a, bに対して次の操作ができる。
- どちらか一方を2で割る(割り切れるときだけ)
- どちらか一方を3で割る(割り切れるときだけ)
- どちらか一方を5で割る(割り切れるときだけ)
この操作を何度か行いa, bを等しくしたい。
必要な操作の回数の最小値はいくつか。操作を行ってもa, bを等しくできないとき-1を返せ。
制約条件
a, b≦10^9
方針
a, bをgcd(a, b)に変更するのが最善。
ゴールが決まったら操作の回数は一意に定まる。
ソースコード
void calc(int a, int &ans){ for(int i = 2; i * i <= a; i++) if(a % i == 0){ if(i > 5) ans = inf; while(a % i == 0) a /= i, ans++; } if(a > 1){ if(a > 5) ans = inf; ans++; } } int main(){ int a, b; cin >> a >> b; int g = __gcd(a, b); int ans = 0; a /= g; b /= g; calc(a, ans); calc(b, ans); cout << (ans >= inf ? -1 : ans) << endl; return 0; }