Two little greedy bears have found two pieces of cheese in the forest of weight a and b grams, correspondingly. The bears are so greedy that they are ready to fight for the larger piece. That's where the fox comes in and starts the dialog: "Little bears, wait a little, I want to make your pieces equal" "Come off it fox, how are you going to do that?", the curious bears asked. "It's easy", said the fox. "If the mass of a certain piece is divisible by two, then I can eat exactly a half of the piece. If the mass of a certain piece is divisible by three, then I can eat exactly two-thirds, and if the mass is divisible by five, then I can eat four-fifths. I'll eat a little here and there and make the pieces equal".
The little bears realize that the fox's proposal contains a catch. But at the same time they realize that they can not make the two pieces equal themselves. So they agreed to her proposal, but on one condition: the fox should make the pieces equal as quickly as possible. Find the minimum number of operations the fox needs to make pieces equal.
The first line contains two space-separated integers a and b (1 ≤ a, b ≤ 109).
If the fox is lying to the little bears and it is impossible to make the pieces equal, print -1. Otherwise, print the required minimum number of operations. If the pieces of the cheese are initially equal, the required number is 0.
15 20
3
14 8
-1
6 6
0
挺好的一个题目,思想简单。
#include <iostream> #include <string> #include <string.h> #include <map> #include <stdio.h> #include <algorithm> #include <queue> #include <vector> #include <math.h> #include <set> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std ; typedef long long LL ; const int inf = 1000000000 ; map<int ,int> meA ,meB ; map<int,int>::iterator it ; set<int>st ; void dfs(int x,int step,map<int,int> &me){ if(me.find(x) != me.end()){ if(me[x] > step) me[x] = Min(me[x],step) ; else return ; } else me[x] = step ; for(int i = 2 ; i <= 5 ; i++){ if(i == 4) continue ; if(x%i == 0) dfs(x/i,step+1,me) ; } } int main(){ int ans ,a ,b ; while(cin>>a>>b){ meA.clear() ; meB.clear() ; st.clear() ; dfs(a,0,meA) ; dfs(b,0,meB) ; ans = inf ; for(it = meA.begin() ; it != meA.end() ; it++) st.insert(it->first) ; for(it = meB.begin() ; it != meB.end() ; it++){ int x = it->first ; if(st.find(x) != st.end()){ ans = Min(ans , meA[x] + meB[x]) ; } } if(ans == inf) cout<<"-1"<<endl ; else cout<<ans<<endl ; } return 0 ; }