这题十分简单,化简一下题意为:一次操作定义为对一个数乘 \(\frac{1}{2}\),\(\frac{1}{3}\) 或 \(\frac{1}{5}\),求使用最少的操作次数,使得两个数 \(a\) 和 \(b\) 相等。
不难发现,每一次都是倍数变换,所以最终的 \(a\) 和 \(b\) 是 \(\gcd(a,b)\)。
当然,由于题目的限制(即指定的数),所以我们要分别对
\(\dfrac{a}{\gcd(a,b)}\) 和 \(\dfrac{b}{\gcd(a,b)}\) 进行质因数分解(即变换过程),检验这两个数是否只由 \(2\),\(3\) 和 \(5\) 构成,并在分解过程中统计质因数的个数。
代码实现十分简单,详细见下:
#include <iostream>
#include <cstdio>
using namespace std;
int ans;
int gcd(int x,int y)
{
if(y==0) return x;
return gcd(y,x%y);
}
bool fj(int x)
{
int y=x;
for(int i=2;i<=5;i++)
while(y%i==0)
y/=i,ans++;
if(y>1) return false;
return true;
}
int main()
{
int a,b;
cin>>a>>b;
int c=gcd(a,b);
a/=c;
b/=c;
if(fj(a)&&fj(b)) cout<<ans;
else cout<<-1;
return 0;
}
标签:frac,gcd,CF371B,int,return,fj,include
From: https://www.cnblogs.com/-lilong-/p/17976816