Codeforces Round #653 (Div. 3) 参与排名人数11687
[codeforces 1374B] Multiply by 2, divide by 6 统计3的幂次+统计2的幂次
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址http://codeforces.com/contest/1374/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Multiply by 2, divide by 6 | GNU C++17 | Accepted | 30 ms | 3900 KB |
题目大意:给定一个数n,可以让n=n*2,也可以让n=n/6(若n%y==0),以上两种操作,每次可任选一种,要求,最后n能等于1,求最小操作次数,若始终不能等于1,那么输出-1。
样例模拟如下:
1
0
1已经符合题意
2
-1
因2中不含因子3,故除6这步操作无法做,故输出-1
3
2
第一步:3*2=6
第二步:6/6=1
12
-1
12=2^2*3
2*3可以配对成6,但剩下的2始终无法除6,故输出-1
12345
-1
12345包含因子5,当剩下因子5时,始终无法除6,故输出-1
15116544
12
15116544=2^8*3^10
第一步:2^8*3^10*2=2^9*3^10
第二步:2^9*3^10*2=2^10*3^10=6^10
之后再除10次6即可,一共12步。
387420489
36
387420489=3^18
先乘2进行18次,数据变成2^18*3^18=(2*3)^18=6^18
之后再除18次6即可,一共36步。
AC代码如下
#include <stdio.h>
int main(){
int t,n,i,cnt3,cnt2,ans;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
cnt3=cnt2=0;
while(n%3==0)n/=3,cnt3++;//统计3的幂次
while(n%2==0)n/=2,cnt2++;//统计2的幂次
if(n>1){printf("-1\n");continue;}//还有其它因子
if(cnt2>cnt3){printf("-1\n");continue;}
ans=cnt3-cnt2+cnt3;//cnt3-cnt2表示需要乘2的次数。cnt3表示需要除6的次数
printf("%d\n",ans);
}
return 0;
}