CF1176A Divide it! 题解

这是一道模拟题。

因为 \(1\leq q\leq 1000\),所以不需要做优化,直接暴力模拟就能过。

在如何判定可不可能做到这一点上则是唯一需要思考一下的。但是很容易就可以发现:如果 \(n\) 不是 \(2,3,5\) 的倍数且不为 \(1\) 的话,那么 \(n\) 自然也就不能再运算,也就不能转化为 \(1\) 了。

根据以上结论,我们就可以理清以下思路:

  1. 如果 \(n\) 已经为 \(1\),那么直接输出步骤。
  2. 判断 \(2,3,5\) 是否能整除 \(n\),并做出响应的运算。
  3. 如果都不能整除,那么输出 \(-1\)。否则继续转到步骤 \(1\)

还有很重要的一点,题目中 \(1\leq n\leq 10^{18}\),所以要开 long long

代码很简单,如下

#include<cstdio>

#define LL long long

using namespace std;

int q;

int main()
{
	scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		LL n;
		scanf("%lld",&n);
		int ans=0;
		while(true)
		{
			if(n==1)			//步骤 1 
			{
				printf("%d\n",ans);
				break;
			}
			ans++;
			if(n%2==0) n=n/2;	//步骤 2 
			else if(n%3==0) n=(2*n)/3;
			else if(n%5==0) n=(4*n)/5;
			else				//步骤 3 
			{
				printf("-1\n");
				break;
			}
		}
	}
	return 0;
}

2021-12-14 22:06 撰写于洛谷,2025-08-25 17:02 迁移至博客园。

posted @ 2025-08-25 17:03  Jerrycyx  阅读(6)  评论(0)    收藏  举报