[codeforces 1374B] Multiply by 2, divide by 6 統計3的冪次+統計2的冪次

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章