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;
}