CF1176A Divide it! 题解
这是一道模拟题。
因为 \(1\leq q\leq 1000\),所以不需要做优化,直接暴力模拟就能过。
在如何判定可不可能做到这一点上则是唯一需要思考一下的。但是很容易就可以发现:如果 \(n\) 不是 \(2,3,5\) 的倍数且不为 \(1\) 的话,那么 \(n\) 自然也就不能再运算,也就不能转化为 \(1\) 了。
根据以上结论,我们就可以理清以下思路:
- 如果 \(n\) 已经为 \(1\),那么直接输出步骤。
- 判断 \(2,3,5\) 是否能整除 \(n\),并做出响应的运算。
- 如果都不能整除,那么输出 \(-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 迁移至博客园。
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/19057347

浙公网安备 33010602011771号