codeforce 1374B数论解法

    技术2023-05-07  65

    #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的倍数的数提前标记好然后,

    Processed: 0.010, SQL: 9