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;
}