codeforce 1374/B 数论解法

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    
    
    int t;
    ios::sync_with_stdio(0);
    cin>>t;
    while(t--){
    
    
        int d;
        cin>>d;
        int val = d,cnt2=0,cnt3=0;
        while(val%2==0)val/=2,cnt2++;
        while(val%3==0)val/=3,cnt3++;
        if(val!=1)cout<<-1<<endl;
        else if(cnt2>cnt3)cout<<-1<<endl;
        else cout<<cnt3+cnt3-cnt2<<endl;
    }
    return 0;
}

题意:输入t个数,对每一个数要么乘2,要么整除6,问每一个数最小步数到1是多少步
分析:一个大于1的数转移到1一定由除6得到,那么从n变为1必须要除6,也就是除2除3,2和3是素因子,由素因子分解定理可知,一个数的素因子个数是唯一的,那么每一个数如果不断地除2除3,

如果最后得到的数为1:

说明只有2,3素因子,如果除2除3的次数相等的,那这个次数就是答案,

如果2,3次数不相等,2多3少,由于不能乘3,也就是不能增添素因子,那么这里就不能转化为更多的6所以这里是-1

如果3多2少,由于可以乘2说明可以把多余的3转化为2,所以输出cnt3-cnt2+cnt3

如果最后得到的数不为1:

如果得不到1那么也就是还有其他素因子,这个素因子不会因为乘2或者除6就能消去,所以答案是-1;

还有一种写法,就是通过打表,提前把所有6的倍数的数提前标记好然后,

猜你喜欢

转载自blog.csdn.net/qq_33859479/article/details/107103810