GAME 2 3

Polycarp plays “Game 23”. Initially he has a number n and his goal is to transform it to m. In one move, he can multiply n by 2 or multiply n by 3. He can perform any number of moves.

Print the number of moves needed to transform n to m. Print -1 if it is impossible to do so.

It is easy to prove that any way to transform n to m contains the same number of moves (i.e. number of moves doesn’t depend on the way of transformation).

Input
The only line of the input contains two integers n and m (1≤n≤m≤5⋅108).

Output
Print the number of moves to transform n to m, or -1 if there is no solution.

Examples
Input
120 51840
Output
7
Input
42 42
Output
0
Input
48 72
Output
-1
Note
In the first example, the possible sequence of moves is: 120→240→720→1440→4320→12960→25920→51840. The are 7 steps in total.

In the second example, no moves are needed. Thus, the answer is 0.

In the third example, it is impossible to transform 48 to 72.

题意:该题的思路是要用m乘2或乘3一直到n;算出一共乘几步;
题解:因为n是用2和3从m乘起来的,所以先用n/m,如果不能整除,说明就是“-1”,如果能,说明商/2或/3就是总共的步数;

#include<cstdio>
using namespace std;
int main()
{
    long long a,b;   a代表题中n,b代表题中m。
    while(~scanf("%lld%lld",&a,&b)){
        long long x = 0;  //x记录执行的次数
        if(b%a != 0){   
            printf("-1\n");
        } 
        else{ 
            b /= a;        
            while(b != 1){ 
                /*if(b%6 == 0){   // 2x3 = 6,可以直接留下光剩下2或者3的情况,也可以不加,直接忽略
                    b /= 6;
                    x += 2;
                }*/    
                if(b%3 == 0){
                    b /= 3;
                    x++;
                }
                else if(b%2 == 0){
                    b /= 2;
                    x++;
                }
                else{    //例如 1 5这种数据在前面b/a的时候无法筛掉,所以在这直接break然后跳出
                    x = -1;
                    break;
                }     
            }
            printf("%lld\n",x);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43888067/article/details/88764882