B. Multiply by 2, divide by 6

You are given an integer n. In one move, you can either multiply n by two or divide n by 6 (if it is divisible by 6 without the remainder).

Your task is to find the minimum number of moves needed to obtain 1 from n or determine if it’s impossible to do that.

You have to answer t independent test cases.

Input
The first line of the input contains one integer t (1≤t≤2⋅10^4) — the number of test cases. Then t test cases follow.

The only line of the test case contains one integer n (1≤n≤10^9).

Output
For each test case, print the answer — the minimum number of moves needed to obtain 1 from n if it’s possible to do that or -1 if it’s impossible to obtain 1 from n.

Example
input
7
1
2
3
12
12345
15116544
387420489

output
0
-1
2
-1
-1
12
36

My Answer Code:

/*
	Author:Albert Tesla Wizard
	Time:2021/2/27 13:06
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
    
    
        int n,cnt1=0,cnt2=0;
        cin>>n;
        bool ans;
        if(n==1)ans=true;
        else if(n%3!=0)ans=false;
        else
        {
    
    
            while(n%3==0){
    
    n/=3;cnt1++;}
            while(n%2==0){
    
    n/=2;cnt2++;}
            if(n!=1||cnt2>cnt1)ans=false;
            else ans=true;
        }
        if(ans)cout<<2*cnt1-cnt2<<'\n';
        else cout<<-1<<'\n';
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/AlberTesla/article/details/114170452
今日推荐